如何在R语言中根据ID行值将两列合并为一列?
问题解决:根据ID合并DataFrame列
需求说明
现有如下DataFrame,需要新增on_off列:
- 当
ID为a1、a2时,取对应行的a_on_off值 - 当
ID为b1、b2时,取对应行的b_on_off值 - 其他
ID对应的on_off设为NA
原始数据:
| a_on_off | b_on_off | ID | Date |
|---|---|---|---|
| off | on | b1 | 2017-08-09 |
| off | on | a2 | 2017-08-09 |
| off | on | a1 | 2017-08-10 |
| off | on | a1 | 2017-08-11 |
| on | on | x1 | 2017-08-12 |
| on | on | x2 | 2017-08-13 |
| on | on | y1 | 2017-08-13 |
| off | off | b1 | 2017-08-13 |
| off | off | a2 | 2017-08-14 |
| off | off | a2 | 2017-08-15 |
| on | on | b2 | 2017-08-15 |
| on | on | y1 | 2017-08-15 |
| on | on | x1 | 2017-08-15 |
| on | on | y3 | 2017-08-16 |
原代码问题
你提供的代码存在两个问题:
- 条件判断的字符串多了多余的闭合括号:
"a2)"、"b2)"是错误写法,应为"a2"、"b2" - 赋值时未对右侧列做行子集匹配,导致将整列值批量填充,而非对应行的值
正确解法
方法1:基础R实现
先初始化on_off列为NA,再针对对应ID的行赋值:
# 初始化on_off列为NA字符型 df$on_off <- NA_character_ # 给a类ID的行赋值对应a_on_off df$on_off[df$ID %in% c("a1", "a2")] <- df$a_on_off[df$ID %in% c("a1", "a2")] # 给b类ID的行赋值对应b_on_off df$on_off[df$ID %in% c("b1", "b2")] <- df$b_on_off[df$ID %in% c("b1", "b2")]
方法2:dplyr包实现(更简洁)
使用case_when按条件批量处理:
library(dplyr) df <- df %>% mutate(on_off = case_when( ID %in% c("a1", "a2") ~ a_on_off, ID %in% c("b1", "b2") ~ b_on_off, TRUE ~ NA_character_ ))
处理后结果示例
处理后的on_off列如下:
| a_on_off | b_on_off | ID | Date | on_off |
|---|---|---|---|---|
| off | on | b1 | 2017-08-09 | on |
| off | on | a2 | 2017-08-09 | off |
| off | on | a1 | 2017-08-10 | off |
| off | on | a1 | 2017-08-11 | off |
| on | on | x1 | 2017-08-12 | NA |
| on | on | x2 | 2017-08-13 | NA |
| on | on | y1 | 2017-08-13 | NA |
| off | off | b1 | 2017-08-13 | off |
| off | off | a2 | 2017-08-14 | off |
| off | off | a2 | 2017-08-15 | off |
| on | on | b2 | 2017-08-15 | on |
| on | on | y1 | 2017-08-15 | NA |
| on | on | x1 | 2017-08-15 | NA |
| on | on | y3 | 2017-08-16 | NA |
内容的提问来源于stack exchange,提问作者mels
相关产品推荐
相关产品推荐

