R语言条件赋值问题:基于规则生成新列Column D
解决方案:R语言实现条件分组计算生成新列
首先还原你的示例数据:
df <- data.frame( Column_A = c("Panda", "Monkey", "Monkey", "Panda"), Column_B = c("Variant 1", "Variant 2", "Variant 1", "Variant 3"), Column_C = c(10.0, 5.0, 7.0, 8.0), stringsAsFactors = FALSE )
方法1:使用dplyr(推荐,可读性高)
通过分组+条件判断实现需求,逻辑清晰:
library(dplyr) df <- df %>% group_by(Column_A) %>% mutate( Column_D = ifelse( Column_B == "Variant 2", # Variant 2行:当前Column_C + 同组内Variant 1的Column_C值 Column_C + Column_C[Column_B == "Variant 1"], # 其他行:直接取Column_C Column_C ) ) %>% ungroup()
运行后得到的结果与你预期一致:
| Column_A | Column_B | Column_C | Column_D |
|---|---|---|---|
| Panda | Variant 1 | 10.0 | 10.0 |
| Monkey | Variant 2 | 5.0 | 12.0 |
| Monkey | Variant 1 | 7.0 | 7.0 |
| Panda | Variant 3 | 8.0 | 8.0 |
方法2:Base R实现(无需额外包)
若不想加载dplyr,可使用ave()函数完成分组取值:
df$Column_D <- with(df, ifelse( Column_B == "Variant 2", Column_C + ave(Column_C, Column_A, FUN = function(x) { # 提取当前组内Variant 1对应的Column_C值 x[df$Column_B[df$Column_A == unique(df$Column_A)] == "Variant 1"] }), Column_C ) )
注意事项
- 假设每组(同一Column_A)内仅存在一个
Variant 1条目,如果有多个,可将Column_C[Column_B == "Variant 1"]替换为sum(Column_C[Column_B == "Variant 1"])或mean(...)等聚合逻辑 - 若数据中存在某组没有
Variant 1的情况,建议添加ifelse(is.na(...), Column_C, ...)处理空值
内容的提问来源于stack exchange,提问作者Christina Keathley
相关产品推荐
相关产品推荐

