R语言dataframe中列值匹配生成新列的问题求助
问题
现有如下结构的DataFrame:
| Column A | Column B | Column C |
|---|---|---|
| E | 1 | 3 |
| F | 2 | 2 |
| G | 3 | 1 |
需要新增Column D,规则是:用每行的Column C值匹配Column B中的值,返回匹配到的B值对应行的Column A值。预期结果如下:
| Column A | Column B | Column C | Column D |
|---|---|---|---|
| E | 1 | 3 | G |
| F | 2 | 2 | F |
| G | 3 | 1 | E |
尝试了以下代码但未得到预期结果:
data <- data %>% mutate(D = case_when(C%in%B~A))
解决方法
你的代码逻辑有误:C%in%B仅判断当前行的C值是否存在于B列,满足条件时直接返回当前行的A值,这和“用C值匹配B列对应行并取该行A值”的需求不符。
以下两种方法可以实现需求:
方法1:用match()函数
match()会返回每个C值在B列中的位置索引,用该索引提取A列对应位置的值即可:
library(dplyr) data <- data %>% mutate(Column_D = Column_A[match(Column_C, Column_B)])
方法2:左连接映射表
先创建B与A的映射关系表,再通过Column C与Column B匹配进行左连接:
library(dplyr) # 生成B到A的映射表 map_df <- data %>% select(Column_B, Column_A) # 左连接并整理列名 data <- data %>% left_join(map_df, by = c("Column_C" = "Column_B")) %>% rename(Column_D = Column_A.y) %>% rename_with(~gsub(".x", "", .x), ends_with(".x"))
这两种方法都能得到预期的结果。
内容的提问来源于stack exchange,提问作者Jelo A
相关产品推荐
相关产品推荐

