2

我有一个由一组和 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列。

4

3 回答 3

3

使用非常简单data.table

如果你想要行数

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

如果您正在寻找Rsplit中的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
于 2014-12-04T11:02:03.250 回答
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

或使用aggregatefrombase R

aggregate(cbind(RowsNum = val1 > val2) ~ group, df, sum)
#  group RowsNum
#1     A       2
#2     B       1
于 2014-12-04T11:02:42.547 回答
1

你可以试试这个

data <- data.frame(group,val1,val2)

attach(data)
aggregate(val1~group,data[which(val1 > val2),],length)
于 2014-12-04T11:49:27.017 回答