我有一个由组和2个值列组成的数据框,如下所示:

group  val1  val2
    A     5     3
    A     2     4
    A     3     1
    B     3     6
    B     2     1
    B     0     2


我想算出val1> val2的行数,按子集划分。最初,我使用以下代码对每个子组进行了硬编码:

number_a <- nrow(subset(df, group=="A" & val1 > val2))
number_b <- nrow(subset(df, group=="B" & val1 > val2))


自动执行此操作的正确方法是什么?我尝试使用split()函数,但无法弄清楚如何同时传递val1val2列。

最佳答案

使用data.table非常简单

如果您想要行数

library(data.table)
setDT(df)[, .(RowsNum = sum(val1 > val2)), by = group]
#    group RowsNum
# 1:     A       2
# 2:     B       1


如果您在基数R中查找splitapply组合,也可以尝试

sapply(split(df[-1], df[1]), function(x) sum(x[1] > x[2]))
# A B
# 2 1


或使用tapply(也来自基数R)

tapply(with(df, val1 > val2), df[1], sum)
# group
# A B
# 2 1




如果您想要行本身

setDT(df)[, .SD[val1 > val2]]
#    group val1 val2
# 1:     A    5    3
# 2:     A    3    1
# 3:     B    2    1


或者也很简单

df[with(df, val1 > val2), ]
#    group val1 val2
# 1     A    5    3
# 3     A    3    1
# 5     B    2    1


要么

subset(df, val1 > val2)
#   group val1 val2
# 1     A    5    3
# 3     A    3    1
# 5     B    2    1

关于r - 拆分,应用和合并2列数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27292223/

10-12 17:59
查看更多