【发布时间】: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] > 0, na.rm = TRUE)或rowSums(b01[-1] < 0, na.rm = TRUE)或rowSums(sapply(b01[-1], is.na))或Reduce(`+`, lapply(b01[-1], is.na))之类的操作或许多其他选项 -
使用 dplyr,这将起作用(如果您对
Gene列b01 %>% mutate(NA.count = rowSums(is.na(.)), lt0 = rowSums(. > 0, na.rm = TRUE), gt = rowSums(. < 0, na.rm = TRUE))的一些警告表示满意的话 -
data.table 可以通过使用 .SDcols 选项避免警告:
library(data.table)DT = data.table(DF)DT[,gt0 := rowSums(.SD > 0,na.rm = TRUE),.SDcols = c("A","B","C","D")] -
@AndresT 你可以做
.SDcols = -1.... -
@akaDrHouse 最好的学习方法是先自己尝试。如果你总是问,你永远学不会。