在R中按id_municipio和year分组统计非零运营商数量
需求描述
- 现有数据集如下:
id_municipio year Vivo Claro TIM Oi Algar Sercomtel MVNO <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> 1 1100015 2009 65.4 13.0 28.2 90.8 0 0 0 2 1100023 2009 775. 154. 334. 1076. 0 0 0 3 1100031 2009 35.2 6.98 15.2 48.8 0 0 0 4 1100049 2009 634. 126. 273. 880. 0 0 0 5 1100056 2009 122. 24.2 52.6 169. 0 0 0 6 1100064 2009 135. 26.7 58.2 187. 0 0 0
- 要求:按
id_municipio和year分组,新增Providers列,统计每组中除分组列外数值大于0的列的数量。 - 预期输出(注:预期中
Providers列数值疑似笔误,实际应为4):
id_municipio year Vivo Claro TIM Oi Algar Sercomtel MVNO total Providers <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> 1 1100015 2009 65.4 13.0 28.2 90.8 0 0 0 197. 0 2 1100023 2009 775. 154. 334. 1076. 0 0 0 2339. 0 3 1100031 2009 35.2 6.98 15.2 48.8 0 0 0 106. 0 4 1100049 2009 634. 126. 273. 880. 0 0 0 1912. 0 5 1100056 2009 122. 24.2 52.6 169. 0 0 0 368. 0 6 1100064 2009 135. 26.7 58.2 187. 0 0 0 407. 0
- 已有部分dplyr代码,需补充
mutate中的逻辑:
library(dplyr) dataset %>% group_by(id_municipio, year) %>% mutate(Providers =...)
解决方案
可以用rowSums()结合across()实现需求,完整代码如下:
library(dplyr) dataset %>% group_by(id_municipio, year) %>% mutate( # 排除分组列,统计数值大于0的列数 Providers = rowSums(across(-c(id_municipio, year), ~.x > 0)), # 可选:添加total列(对应预期输出中的求和列) total = rowSums(across(-c(id_municipio, year))) )
代码解释
across(-c(id_municipio, year)):选中除分组列之外的所有列;~.x > 0:对每一列的每个元素判断是否大于0,返回布尔值(TRUE/FALSE);rowSums():将每行的布尔值转化为数值(TRUE=1,FALSE=0)后求和,得到每行中数值大于0的列的数量;total列是可选的,对应预期输出中的求和列,若不需要可删除该行。
内容的提问来源于stack exchange,提问作者Mateus Maciel
相关产品推荐
相关产品推荐

