R语言分组计算面积占比时map_dbl运算报错的解决方法
错误原因
- 分组逻辑错误:原分组代码将
area(km^2)也加入了分组维度,相当于把每条单独的记录作为独立分组,统计得到的总和不符合预期。 - 占比计算逻辑错误:使用
map_dbl遍历单个面积值时,除以的是总和向量(长度等于分组数量),返回结果长度和map_dbl要求的单值规则冲突,因此触发长度不匹配报错。
最简解决方案(tidyverse)
直接在分组后用mutate配合分组求和函数计算占比,一步得到结果:
library(dplyr) # 导入测试数据集 test_one <- structure(list(year = c(2001, 2001, 2001, 2001, 2001, 2001), disastertype = c("earthquake", "earthquake", "earthquake", "extreme temperature ", "extreme temperature ", "extreme temperature " ), `area(km^2)` = c(1907.09808242381, 3635.37825411105, 5889.17746880181, 8042.39623016696, 11263.4848508564, 11802.3111500339), country = c("Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan")), row.names = c(1L, 10L, 65L, 109L, 135L, 146L), class = "data.frame") # 计算分组占比 result <- test_one %>% group_by(year, country, disastertype) %>% # 仅按指定的三个维度分组 mutate(proportion = `area(km^2)` / sum(`area(km^2)`)) %>% # 当前行面积除以分组总面积 ungroup() # 可选,解除分组方便后续数据操作
先算总和再合并的实现方式
如果需要单独生成分组总和表再合并计算,可采用如下写法:
# 生成分组总和表 test_sum <- test_one %>% group_by(year, country, disastertype) %>% summarise(total_area = sum(`area(km^2)`), .groups = "drop") # 关联回原表计算占比 result <- test_one %>% left_join(test_sum, by = c("year", "country", "disastertype")) %>% mutate(proportion = `area(km^2)` / total_area) %>% select(-total_area)
以上两种方案输出的结果都和你给出的预期结果完全一致。
内容的提问来源于stack exchange,提问作者Stackbeans
相关产品推荐
相关产品推荐

