如何用dplyr的summarize和across为每组新增efficiency计算行?
解决方案
你可以修改代码,通过在分组内先提取Prod和Area的年份数据,计算出efficiency的对应值后,再与原组数据合并,具体代码如下:
ag_prod4 %>% group_by(country, item) %>% group_modify(function(data, keys) { # 提取当前组的Prod和Area行的年份列数据 prod_vals = data[data$element == "Prod", starts_with("1961"):starts_with("2021")] area_vals = data[data$element == "Area", starts_with("1961"):starts_with("2021")] # 计算efficiency的年份值,处理可能的NA(比如某组没有Prod或Area的情况) efficiency_vals = ifelse(area_vals == 0 | is.na(area_vals), NA, prod_vals / area_vals) # 构造新增的efficiency行 efficiency_row = tibble( country = keys$country, item = keys$item, element = "efficiency", !!!efficiency_vals ) # 合并原数据和新增行 bind_rows(data, efficiency_row) }) %>% ungroup()
代码说明:
- 用
group_modify替代summarize,能更灵活地操作每组的完整数据集,不受组内element数量、顺序的影响 - 直接定位组内的
Prod和Area行提取数值,避免依赖固定行序 - 加入了对0值和NA的判断,防止出现除以0的报错
- 通过
bind_rows保留原有所有记录的同时,新增目标efficiency行
内容的提问来源于stack exchange,提问作者Shy
相关产品推荐
相关产品推荐

