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

Using tidyverse to group and summarise the coefficient of variation

我有一个数据框,其中包含 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))

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

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

尝试:

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

当你真的需要引用一个dataframe时,你可以使用.,例如summarise(cv= cv(.$precip)),虽然这里你不需要这个。这与将 data 作为参数的函数更相关(例如 lm,其第一个参数不是数据帧)。

为防止将来出现此问题,了解发生的情况可能会有所帮助:在您对 summarise 的调用中,您引用了 df$precip,因此函数 cv 使用正是您作为输入提供的内容,即整个向量 df$precip,而不是它的分组元素。