在R中按行业分组基于固定值计算Share列的技术问题
原代码的问题
- 管道符书写错误:
group_by(Industry)%>少了一个%,正确写法是group_by(Industry)%>% - 列名笔误:
match("9999", noc_code)里的noc_code应为实际列名noc_doe - 类型不匹配:如果
noc_doe是数值类型,用字符串"9999"匹配会返回NA,需改用数值9999
修正后的完整代码
先构造示例数据,再执行计算:
# 构建示例数据集 df <- data.frame( Industry = c("mining", "mining", "mining", "mining", "agriculture", "agriculture", "agriculture", "agriculture"), noc_doe = c(9999, 1, 5, 941, 9999, 701, 6785, 8456), VALUE = c(100, 15, 33, 50, 100, 25, 4, 90) ) # 加载dplyr包并计算Share列 library(dplyr) df <- df %>% group_by(Industry) %>% # 每个分组内取noc_doe=9999对应的VALUE作为分母 mutate(Share = VALUE / VALUE[noc_doe == 9999]) %>% ungroup() # 可选,取消分组状态,方便后续操作 # 查看结果 print(df)
额外优化方案
如果担心每个行业分组内可能存在多个noc_doe=9999的记录,可以用first()确保只取第一个匹配值,避免长度不匹配的错误:
df <- df %>% group_by(Industry) %>% mutate(Share = VALUE / first(VALUE[noc_doe == 9999])) %>% ungroup()
预期输出
运行代码后会得到你想要的结果:
| Industry | noc_doe | VALUE | Share |
|---|---|---|---|
| mining | 9999 | 100 | 1 |
| mining | 1 | 15 | 0.15 |
| mining | 5 | 33 | 0.33 |
| mining | 941 | 50 | 0.5 |
| agriculture | 9999 | 100 | 1 |
| agriculture | 701 | 25 | 0.25 |
| agriculture | 6785 | 4 | 0.04 |
| agriculture | 8456 | 90 | 0.9 |
内容的提问来源于stack exchange,提问作者user15032839
相关产品推荐
相关产品推荐

