如何连续计算小于0且大于0的值的数量

时间:2018-07-10 17:04:32

标签: r data.table apply

我有一个非常大的数据集,我想生成新的列,且各行的值计数大于0且小于0。然后,我想添加另一列来划分这些值(例如,above0_column / below0_column)

我的数据看起来像这样:

ID SNP1 SNP2 SNP3 SNP4
1  -0.5 0.32 1.2  -0.8
2  1.5  -1.2 0.3  -0.6
3  2.6  -3.4 0.2  5.0
4  -0.3 5.0  -1.2 -0.3

新列应显示ID 1:<0代表2,> 0代表2

这些是我尝试过的功能:

data$above0<-apply(data,1,function(i) sum(i>0))

data$above0<- Reduce('+', lapply(data,'>',0))

两者都生成了一个新列,但是,这些列中没有填充任何值。当我查看“ above0”列时,它充满了NA。我是否可以使用另一个简单函数来生成计数> 0和<0的新列?最后是column1 / column2?

2 个答案:

答案 0 :(得分:3)

您可以使用rowSums(应该比原来的apply更快):

dat$gt0 <- rowSums(dat[,c("SNP1", "SNP2", "SNP3", "SNP4")]>0)
dat$lt0 <- rowSums(dat[,c("SNP1", "SNP2", "SNP3", "SNP4")]<0)

dat
#  ID SNP1  SNP2 SNP3 SNP4 gt0 lt0
#1  1 -0.5  0.32  1.2 -0.8   2   2
#2  2  1.5 -1.20  0.3 -0.6   2   2
#3  3  2.6 -3.40  0.2  5.0   3   1
#4  4 -0.3  5.00 -1.2 -0.3   1   3

有多种方法来选择所需的变量,但我个人更喜欢使用字符向量显式选择感兴趣的列。

在此之后,除法很简单:

dat$div_gt0_lt0 <- dat$gt0 / dat$lt0

如果需要,您也可以一次性创建,而无需创建中间列:

dat$div_gt0_lt0 <- rowSums(dat[,c("SNP1", "SNP2", "SNP3", "SNP4")]>0) / rowSums(dat[,c("SNP1", "SNP2", "SNP3", "SNP4")]<0)

答案 1 :(得分:2)

我们可以将applytable一起使用

data[c('below0', 'above0')] <- t(apply(data[-1], 1,
            function(x) table(sign(x[x!=0]))))
data
#  ID SNP1  SNP2 SNP3 SNP4 below0 above0
#1  1 -0.5  0.32  1.2 -0.8      2      2
#2  2  1.5 -1.20  0.3 -0.6      2      2
#3  3  2.6 -3.40  0.2  5.0      1      3
#4  4 -0.3  5.00 -1.2 -0.3      3      1