R语言数据框如何实现指定列除以某列同时保留ID列
R数据框逐行计算保留指定列方案
需求
- 4列数据框包含A、B、C、ID四个字段
- A、B列逐行除以对应行的C列值
- ID列保持原值不变
- C列可选择保留或删除,参考输出中C列值为1(即C列同步除以自身)
示例数据
原始数据:
| A | B | C | ID |
|---|---|---|---|
| 4 | 8 | 23 | 1 |
| 5 | 12 | 325 | 2 |
| 6 | 23 | 56 | 3 |
| 73 | 234 | 21 | 4 |
| 23 | 23 | 213 | 5 |
期望输出:
| A | B | C | ID |
|---|---|---|---|
| 0,173913043 | 0,347826087 | 1 | 1 |
| 0,015384615 | 0,036923077 | 1 | 2 |
| 0,107142857 | 0,410714286 | 1 | 3 |
| 3,476190476 | 11,14285714 | 1 | 4 |
| 0,107981221 | 0,107981221 | 1 | 5 |
注:输出中小数点为逗号是区域格式设置差异,R默认计算结果为点号分隔小数。
原有代码问题
原代码仅提取A、B两列做除法,直接赋值会覆盖原数据框其他列,导致ID列丢失:
columns_to_divide <- c(1,2) results <- results[,columns_to_divide ]/results[,3]
正确实现
匹配示例输出(保留C列,C列值为1)
直接在原数据框对应列上做计算,不会丢失未处理的ID列,同时C列同步除以自身得到值1:
# 指定要做除法的列:A、B、C三列 columns_to_divide <- c("A", "B", "C") # 逐行除以对应C列值,原数据框的ID列不受影响 results[, columns_to_divide] <- results[, columns_to_divide] / results$C
不保留C列版本
如果不需要保留C列,计算A、B列后和ID列拼接即可:
# 计算A、B列除以C列的结果 cal_part <- results[, c("A", "B")] / results$C # 拼接ID列得到最终结果 results <- data.frame(cal_part, ID = results$ID)
注意事项
- 不要把除法计算的结果直接赋值给原数据框变量,否则会覆盖所有未参与计算的列
- 优先使用列名引用字段,比数字索引更稳定,不会因为列顺序变动导致计算错误
- R原生支持向量按行对齐运算,不需要额外写循环逐行处理
内容的提问来源于stack exchange,提问作者Robxaa798
相关产品推荐
相关产品推荐

