我有一个由一组和两个值列组成的数据框,如下所示:
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
列。
答案 0 :(得分:3)
使用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
或者基本R也很简单
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
答案 1 :(得分:2)
使用dplyr
library(dplyr)
filter(df, val1 >val2)
# group val1 val2
#1 A 5 3
#2 A 3 1
#3 B 2 1
如果您需要nrows
df %>%
group_by(group) %>%
filter(val1 >val2) %>%
summarise(RowsNum=n())
# group RowsNum
#1 A 2
#2 B 1
或使用aggregate
base R
aggregate(cbind(RowsNum = val1 > val2) ~ group, df, sum)
# group RowsNum
#1 A 2
#2 B 1
答案 2 :(得分:1)
你可以试试这个
data <- data.frame(group,val1,val2)
attach(data)
aggregate(val1~group,data[which(val1 > val2),],length)