我有一个由组和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()
函数,但无法弄清楚如何同时传递val1
和val2
列。 最佳答案
使用data.table
非常简单
如果您想要行数
library(data.table)
setDT(df)[, .(RowsNum = sum(val1 > val2)), by = group]
# group RowsNum
# 1: A 2
# 2: B 1
如果您在基数R中查找
split
,apply
组合,也可以尝试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/