我有一个非常大的数据集,我想生成新的列,且各行的值计数大于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?
答案 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)
我们可以将apply
与table
一起使用
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