【问题标题】:Conditionals calculations across rows R跨行的条件计算 R
【发布时间】:2016-03-09 14:15:32
【问题描述】:

首先,我是 R 的新手,正在从 SAS 切换。我有一个 1000 行 x 24 列的数据集,其中的列是不同的处理方法。我想在下面列出的数据集的各行中计算观察满足条件的次数。

            Gene        A       B        C         D
1         AARS_3       NA      NA 4.168365        NA
2 AASDHPPT_21936       NA      NA       NA -3.221287
3     AATF_26432       NA      NA       NA        NA
4       ABCC2_22 4.501518 3.17992       NA        NA
5    ABCC2_26620       NA      NA       NA        NA

我试图创建计数的列向量

  • 1) NA 数量
  • 2) 列数
  • 3) 列数 >0

然后我会使用 cbind 将这些添加到我的大型数据集中

我解决了第一个问题:

NA.Count <- (apply(b01,MARGIN=1,FUN=function(x) length(x[is.na(x)])))

我尝试修改它以计算评估 !is.na,然后计算该值小于零的次数:

lt0 <- (apply(b01,MARGIN=1,FUN=function(x) ifelse(x[!is.na(x)],count(x[x<0]))))

这根本不起作用。

我尝试了十几种方法让 dplyr mutate 来处理这个问题,但都没有成功。

我想要的是下面的最后两列;如果你有一个更简洁的 NA.Count 版本,我将不胜感激。

             Gene        A       B       C          D   NA.Count   lt0   gt0
 1         AARS_3       NA      NA 4.168365        NA     3         0      1
 2 AASDHPPT_21936       NA      NA       NA -3.221287     3         1      0
 3     AATF_26432       NA      NA       NA        NA     4         0      0
 4       ABCC2_22 4.501518 3.17992       NA        NA     2         0      2
 5    ABCC2_26620       NA      NA       NA        NA     4         0      0

【问题讨论】:

  • R 恰好是一种矢量化语言。您可以执行rowSums(is.na(b01[-1]))rowSums(b01[-1] &gt; 0, na.rm = TRUE)rowSums(b01[-1] &lt; 0, na.rm = TRUE)rowSums(sapply(b01[-1], is.na))Reduce(`+`, lapply(b01[-1], is.na)) 之类的操作或许多其他选项
  • 使用 dplyr,这将起作用(如果您对 Geneb01 %&gt;% mutate(NA.count = rowSums(is.na(.)), lt0 = rowSums(. &gt; 0, na.rm = TRUE), gt = rowSums(. &lt; 0, na.rm = TRUE)) 的一些警告表示满意的话
  • data.table 可以通过使用 .SDcols 选项避免警告:library(data.table)DT = data.table(DF)DT[,gt0 := rowSums(.SD &gt; 0,na.rm = TRUE),.SDcols = c("A","B","C","D")]
  • @AndresT 你可以做.SDcols = -1....
  • @akaDrHouse 最好的学习方法是先自己尝试。如果你总是问,你永远学不会。

标签: r dplyr


【解决方案1】:

这是利用 TRUE 在 R 中等于 1 的事实的一种方法。

# test data frame
lil_df <- data.frame(Gene = c("AAR3", "ABCDE"),
                 A = c(NA, 3),
                 B = c(2, NA),
                 C = c(-1, -2),
                 D = c(NA, NA))

# is.na
NA.count <- rowSums(is.na(lil_df[,-1]))

# less than zero
lt0 <- rowSums(lil_df[,-1]<0, na.rm = TRUE)

# more that zero
mt0 <- rowSums(lil_df[,-1]>0, na.rm = TRUE)

# cbind to data frame
larger_df <- cbind(lil_df, NA.count, lt0, mt0 )

larger_df
  Gene  A  B  C  D NA.count lt0 mt0
1  AAR3 NA  2 -1 NA        2   1   1
2 ABCDE  3 NA -2 NA        2   1   1

【讨论】:

  • 感谢 M_Fidino 抽出时间来安排。 David Arenburg 在评论中提供了相同的信息,我非常感谢您的回复。
猜你喜欢
  • 1970-01-01
  • 2017-12-15
  • 2020-04-24
  • 2022-01-15
  • 1970-01-01
  • 1970-01-01
  • 2015-12-13
  • 2022-12-06
  • 1970-01-01
相关资源
最近更新 更多