R和dplyr:使用特定组成分的值作为总结的输出

时间:2015-04-19 15:21:57

标签: r group-by dplyr summary

我的数据看起来像这样:

df = data.frame("itm" = c(1,2,1,2,1,2), 
"month" = c(1,1,2,2,3,3), 
"value" = c(0.6, 0.5, 0.4, 0.3,0.2,0.1))

>df
    itm month value
1   1     1   0.6
2   2     1   0.5
3   1     2   0.4
4   2     2   0.3
5   1     3   0.2
6   2     3   0.1

我使用dplyr按月对数据进行分组,然后汇总以查找按月分配的平均值。

> dfg = group_by(df, month)
> dfs = summarize(dfg, avg=mean(value))
> dfs
Source: local data frame [3 x 2]

  month  avg
1     1 0.55
2     2 0.35
3     3 0.15

到目前为止,一切都按预期工作。但我还希望在dfs中有一个列,它具有给定月份中第2项的“值”。

我觉得这样的事情可能有用:

> dfs$itm2 = filter(dfg, itm==2)

但我明白了:

> dfs
Source: local data frame [3 x 3]

  month  avg     itm2
1     1 0.55 <dbl[3]>
2     2 0.35 <dbl[3]>
3     3 0.15 <dbl[3]>

显然,我不知道自己在做什么。我怀疑使用“dfs $ itm2 =”是一个问题。

顺便说一句,如果我能用原始的summaryrize命令创建“itm2”列,我会很高兴。原则上,我知道我可以定义一个函数来从每个组中选择“itm == 2”条目,并在汇总调用中包含该函数...在实践中我没有运气。

道歉,如果这是一个多余的问题 - 我已经努力找到一个类似的问题,但没有成功。谢谢你的帮助!

1 个答案:

答案 0 :(得分:2)

你可以尝试

dfg %>% 
    summarise(ave= mean(value), itm2= value[itm==2])
#   month  ave itm2
#1     1 0.55  0.5
#2     2 0.35  0.3
#3     3 0.15  0.1

filter的输出是data.frame,有3列

 filter(dfg, itm==2)
 # itm month value
 #1   2     1   0.5
 #2   2     2   0.3
 #3   2     3   0.1

因此,帖子中的代码基本上是将data.frame/tbl_df分配给data.frame中的列。

我想,您需要选择value列,然后将其分配给dfs$itm2

 dfs$itm2 <- filter(dfg, itm==2) %>%
                                .$value