你能在dplyr链中使用两次data.frame吗? dplyr说“错误:无法处理”

时间:2015-08-13 19:01:44

标签: r dplyr

我试图在dplyr链中使用两次data.frame。这是一个给出错误的简单示例

df <- data.frame(Value=1:10,Type=rep(c("A","B"),5))

df %>% 
  group_by(Type) %>% 
  summarize(X=n())  %>% 
  mutate(df %>%filter(Value>2) %>%  
  group_by(Type) %>%  
  summarize(Y=sum(Value)))

Error: cannot handle

因此,我们的想法是首先使用两列data.frame创建Value,这两列只是一些数据,Type表示值来自哪个组。

然后我尝试使用汇总来获取每个组中的对象数,然后在数据被过滤后再次使用该对象来获取值的总和。但是我得到了Error: cannot handle。有什么想法吗?

期望输出:

Type X Y
  A  5 24
  B  5 28

2 个答案:

答案 0 :(得分:6)

您可以尝试以下

df %>% 
  group_by(Type) %>% 
  summarise(X = n(), Y = sum(Value[Value > 2]))

# Source: local data frame [2 x 3]
# 
#   Type X  Y
# 1    A 5 24
# 2    B 5 28

我们的想法是只根据所需条件过滤Value,而不是整个数据集

奖金解决方案

library(data.table)
setDT(df)[, .(X = .N, Y = sum(Value[Value > 2])), by = Type]
#    Type X  Y
# 1:    A 5 24
# 2:    B 5 28

打算向@nongkrong建议,但他删除了,基地R我们也可以这样做

aggregate(Value ~ Type, df, function(x) c(length(x), sum(x[x>2])))
#   Type Value.1 Value.2
# 1    A       5      24
# 2    B       5      28

答案 1 :(得分:3)

使用ifelse()

也很容易
df %>% group_by(Type) %>% summarize(X=n(),y=sum( ifelse(Value>2, Value, 0 )))

输出:

Source: local data frame [2 x 3]

  Type X  y
1    A 5 24
2    B 5 28