R语言使用group_by按年月统计tipo_dia数量遇到的问题
问题原因说明
- 第一种写法报错是因为
tipo_dia是字符类型变量,sum()无法对字符串执行求和运算,因此触发报错。 - 第二种写法结果全为1是因为你已经将
año、mes、tipo_dia三个变量作为分组依据,每个分组内的tipo_dia取值唯一,unique(tipo_dia)的长度必然是1,因此得到的统计值全部为1。
正确实现代码
场景1:统计每个分组下的总观测行数
如果需要统计的是该分组下所有数据的行数,直接使用dplyr内置的n()函数即可:
library(dplyr) result <- df %>% group_by(año, mes, tipo_dia) %>% summarise(tipo_dia_conteo = n(), .groups = "drop")
其中.groups = "drop"参数用于关闭summarise默认保留的分组结构,避免后续操作出现不必要的警告。
场景2:统计每个分组下的独立日期数
如果你的数据中同一日期存在多条观测,需要避免重复计数,可以用n_distinct()统计唯一日期的数量:
library(dplyr) result <- df %>% group_by(año, mes, tipo_dia) %>% summarise(tipo_dia_conteo = n_distinct(fecha), .groups = "drop")
可选:转换为宽表展示
如果想要将不同tipo_dia作为单独列展示,方便逐月对比,可以搭配tidyr的pivot_wider()实现:
library(dplyr) library(tidyr) result_wide <- df %>% group_by(año, mes, tipo_dia) %>% summarise(tipo_dia_conteo = n(), .groups = "drop") %>% pivot_wider( names_from = tipo_dia, values_from = tipo_dia_conteo, values_fill = 0 # 不存在的类型默认填充0 )
内容的提问来源于stack exchange,提问作者Alejandro Carrera
相关产品推荐
相关产品推荐

