【问题标题】:How to count number of values less than 0 and greater than 0 in a row如何连续计算小于0和大于0的值的数量
【发布时间】:2018-12-18 15:01:29
【问题描述】:

我有一个非常大的数据集,我想生成跨行的值计数大于 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

这些是我尝试过的功能:

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

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

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

【问题讨论】:

  • 我编辑了您的代码问题,当代码和数据被专门格式化时,它通常有助于提高可读性。请阅读其他SO question formatting tricks。谢谢!
  • 你要apply(data[-1], 1, function(x) table(sign(x)))
  • 我相信rowSums 应该比apply(data,1,function(i) sum(i&gt;0)) 快。另外,对我来说它看起来更简单

标签: r data.table apply


【解决方案1】:

您可以使用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)

【讨论】:

  • 我不得不将其更改为 dat$gt0 0) 因为我有超过 200 个 SNP 名称,我无法单独输入,但我遇到相同的问题,即我的新列“gt0”仅填充了 NA。是否有另一种方法可以使用此代码而无需单独输入 SNP 名称?
  • 您的行中可能有一些NAs。尝试添加一个 !is.na() 条件,例如:dat[,c("SNP1", "SNP2", "SNP3", "SNP4")]&gt;0 &amp; !is.na(dat[,c("SNP1", "SNP2", "SNP3", "SNP4")])
【解决方案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

【讨论】:

  • @Ryan 谢谢,我在考虑这个,不能早点更新。现已更新
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-19
  • 2021-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-14
相关资源
最近更新 更多