我有一个data.frame,我想在其中执行逐行计数与指定标准。我无法弄清楚的部分是我想为每一行设置不同的计数标准。
假设我有10行,我想为10行设置10个不同的标准。
我试过:count.above <- rowSums(Data > rate)
,其中rate是一个带有10个标准的向量,但R只使用第一个作为整个框架的标准。
我想我可以将我的框架分成10个向量并执行此任务,但我认为有一些简单的方法可以做到这一点而不诉诸于此。
答案 0 :(得分:1)
编辑:这取决于您是要对行还是列进行操作。见下文:
这是mapply
和Reduce
的工作。假设您有一个
df1 <- data.frame(a=1:10,b=2:11,c=3:12)
假设我们想要计算a> 6,b&gt; 3和c&gt; 5的行数。这是通过mapply
:
mapply(">",df1,c(6,3,5),SIMPLIFY=FALSE)
$a
[1] FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE
$b
[1] FALSE FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
$c
[1] FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
现在我们使用Reduce
查找全部TRUE
:
Reduce("&",mapply(">",df1,c(6,3,5),SIMPLIFY=FALSE))
[1] FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE
最后,我们使用sum
将它们全部添加:
sum(Reduce("&",mapply(">",df1,c(6,3,5),SIMPLIFY=FALSE)))
[1] 4
如果您想要每行而不是全局聚合的结果,那么apply
是要使用的函数:
apply(df1,1,function(v) sum(v>c(6,3,5)))
[1] 0 0 1 2 2 2 3 3 3 3
答案 1 :(得分:0)
给出虚拟数据(来自@ zx8754s解决方案)
# dummy data
df1 <- data.frame(matrix(1:15, nrow = 3))
myRate <- c(7, 5, 1)
使用应用
的解决方案由@JDL提供
rowSums(apply(df1, 2, function(v) v > myRate))
使用Reduce模式的替代解决方案
Reduce(function(l, v) cbind(l[,1] + (l[,2] > myRate), l[,-2:-1]),
1:ncol(df1),
cbind(0, df1))