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

R and dplyr: using value of specific group constituent as output of summarise

我有这样的数据:

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 项的 "value"。

我认为这样的方法可能有效:

> 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 =" 是个问题。

顺便说一句,如果我能用原始的汇总命令创建 "itm2" 列,我会很高兴。原则上,我知道我可以为每个组的 select "itm==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 的输出是具有 3 列的 data.frame

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

所以,基本上 post 中的代码是将 data.frame/tbl_df 分配给 data.frame 中的列。

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

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