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
我有这样的数据:
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