我的数据看起来像这样:
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”条目,并在汇总调用中包含该函数...在实践中我没有运气。
道歉,如果这是一个多余的问题 - 我已经努力找到一个类似的问题,但没有成功。谢谢你的帮助!
答案 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