【问题标题】:loop if conditions are met and append values to vector, else skip to next如果满足条件则循环并将值附加到向量,否则跳到下一个
【发布时间】:2015-10-09 16:01:51
【问题描述】:

我对 R 比较陌生,如果我的问题不完全清楚,请原谅:)

我从 2 个列表开始(其中一个 (ftyes) 在这里被截屏)。我有一个名为“ksauto”的函数,它对“类别”列中的条目执行 Kolmogorov-Smirnov (ks) 测试,以比较 2 个列表中“log2fc”列下的相应值。该函数还汇总了每个类别的条目数。

我已经编写了一个循环来为“类别”下的每个唯一条目运行该函数,并将输出附加到向量,我将从该向量中制作一个表格。问题是,对于“类别”下的某些条目,例如catE,列表之一仅包含 NA 值,这会为 ks 测试产生问题并停止循环。我想写一个 IF 子句来排除这些条目,但无法让它工作。

功能:

          ksauto <- function(i){
#picks out entries with i in both lists
          subyes <<- ftyes[ftyes$category== i,]  
          subno <<- ftno[ftno$category== i,]  
#save output values
          name <<- toString(i)
          ks <<- round(ks.test(subyes$FC,subno$FC)$p.value,digits=5)
          yescpe <<- sum(ftyes$category == i)
          nocpe <<- sum(ftno$category == i)
          }

循环:

for(i in unique(bpyes$name_1006)) 
      {
#runs function for each unique i, append output to vector
      ksauto(i)
      vname[i] <- name
      vks[i] <- ks
      vyescpe[i] <- yescpe
      vnocpe[i] <- nocpe
      }

我有这样的 IF 子句:

((sum(!is.na(subyes$FC)) != 0 )&( sum(!is.na(subno$FC)) != 0 ))

我尝试将它放在函数中并将逻辑参数切换到 OR 子句,还将 next 和 else 命令添加到 IF 子句,但没有任何效果。如果我能得到一些意见,那就太好了。感谢您的宝贵时间!

example of one of two lists

最好的,

威尔逊

【问题讨论】:

  • ?try?tryCatch

标签: r loops if-statement unique


【解决方案1】:

这是一个没有数据的猜测,所以我不知道它是否会起作用。请注意,重塑不适用于列表变量:(让我知道是否可以保证对于每个名称, subyes$FC 和 subno$FC 将具有完全相同数量的值。这将使事情变得容易得多。

library(dplyr)
library(magrittr)

unique_name = bpyes %>% select(name = name_1066) %>% distinct

yes_summary = 
  unique_name %>%
  left_join(subyes %>% rename(name = category) ) %>%
  group_by(name) %>%
  summarize(yes_count = n(),
            yes_FC_list = list(FC)) %>%
  filter(yes_count > 0)

no_summary = 
  unique_name %>%
  left_join(subno %>% rename(name = category) ) %>%
  rename(name = category) %>%
  group_by(name) %>%
  summarize(no_count = n(),
            no_FC_list = list(FC))  %>%
  filter(no_count > 0)

result = 
  inner_join(yes_summary, no_summary) %>%
  rowwise %>%
  mutate(ks = ks.test(no_FC_list, yes_FC_list) %>%
                use_series(p.value) %>%
                round(digits = 5) ) %>%
  select(-no_FC_list, -yes_FC_list)

【讨论】:

  • 有些命令我还不熟悉。我会测试一下。非常感谢!
猜你喜欢
  • 2021-10-20
  • 1970-01-01
  • 1970-01-01
  • 2017-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-30
相关资源
最近更新 更多