仅使用base R如何按X2列条件将X1值赋值给X3列
base R 按条件替换数据框列值
需求说明
针对构造的示例数据框df1,实现规则:当X2列取值为'begin'时,将对应行X1列的取值赋值给同行X3列,其余行X3的原有取值保持不变,全程仅使用base R完成,不依赖任何第三方扩展包。
原始示例数据构造代码
df1 <- data.frame(rbind(c('C001','begin', ''), c('C001','contac', 'yes'), c('C001','motivation', 'no'), c('C001','other', ''), c('C002','begin', ''), c('C002','contac', 'yes'), c('C002','motivation', 'yes'), c('C002','other', 'big'), c('C003','begin', ''), c('C003','contac', 'no'), c('C003','request', 'no'), c('C003','other', '')))
实现代码
直接使用base R原生的逻辑向量索引赋值即可,代码简洁且执行效率高:
# 复制原数据生成df2,避免修改原始df1的内容 df2 <- df1 # 提取符合X2=='begin'的行索引,将对应行X3替换为同行X1的值 match_row <- df2$X2 == 'begin' df2$X3[match_row] <- df2$X1[match_row]
结果校验
运行代码后打印df2,得到的结果和预期完全一致:
print(df2)
控制台输出:
X1 X2 X3 1 C001 begin C001 2 C001 contac yes 3 C001 motivation no 4 C001 other 5 C002 begin C002 6 C002 contac yes 7 C002 motivation yes 8 C002 other big 9 C003 begin C003 10 C003 contac no 11 C003 request no 12 C003 other
注意事项
- 如果
X2列存在缺失值NA,需要在匹配条件中增加非缺失判断,避免索引出现NA导致赋值错误,修改后的匹配条件为match_row <- df2$X2 == 'begin' & !is.na(df2$X2) - 如果不需要保留原始
df1的内容,可以直接对df1操作,省略复制生成df2的步骤。
内容的提问来源于stack exchange,提问作者Gabriela Tavares
相关产品推荐
相关产品推荐

