使用tidyverse对变异系数进行分组和汇总

时间:2017-09-05 00:04:41

标签: r tidyverse

我有一个1997年至2016年间每月降水量的数据框。这是一个例子:

 df<- data.frame(year= as.character(c("1997", "1997","1997","1997","1997","1997","1998","1998","1998")),month= as.character(c("1", "1","1","2","2","2","1","1","1")),cont_month= as.character(c("1", "1","1","2","2","2","13","13","13")),precip= as.numeric(c(5, 2,4,5,6,2,1,3,7)))

我想计算每个Cont_Month子集的每日降水量的变异系数。我使用cv()包使用函数library(raster)。新数据框应如下所示:

 output<- data.frame(year= as.character(c("1997", 
 "1997","1998")),month= as.character(c("1", "2","1")),cont_month= 
 as.character(c("1", "2","13")),cv= as.numeric(c(41.6, 48.03,83.31))

我在使用下面的代码时遇到问题,但它未能通过precip变量成功对每日cont_month进行分组。而是在precip列中重复相同的值。知道我的错误是什么吗?

output<- 
df %>%
 group_by(year, month,cont_month)%>%
  summarise(cv= cv(df$precip))

1 个答案:

答案 0 :(得分:3)

尝试:

library(dplyr)
library(raster)

out <- 
   df %>%
   group_by(year, month,cont_month)%>%
   summarise(cv= cv(precip))

out
# A tibble: 3 x 4
# Groups:   year, month [?]
    year  month cont_month       cv
  <fctr> <fctr>     <fctr>    <dbl>
1   1997      1          1 41.65978
2   1997      2          2 48.03845
3   1998      1         13 83.31956

当您确实需要引用数据框时,您可以使用.,例如summarise(cv= cv(.$precip)),但在此您不需要这样做。这与以data作为参数的函数更相关(例如lm,其第一个参数不是数据帧)。

为防止此问题在未来出现,了解发生的情况可能很有用:在您的总结调用中,您已提到df$precip,因此函数cv正好使用了什么你提供了一个输入,即整个向量df$precip,而不是它的分组元素。