使用 dplyr (R)

问题描述

一个相对微不足道的问题,它一直困扰着我一段时间,但我还没有找到答案——也许是因为我很难用语言表达搜索引擎的问题。

这是包含标识符的数据框的一列。

data <- data.frame("id" = c("D78","L30","F02","A23","B45","T01","Q38","S30","K84","O04","P12","Z33")) 

根据查找表,过时的标识符将重新编码为新的标识符。这是一个查找表示例。

recode_table <- data.frame("old" = c("A23","Z33"),"new" = c("A24","B46","K88","Z33"))

我现在需要的可以通过合并或循环来完成。这是一个循环示例:

for(ID in recode_table$old) {
  data[data$id == ID,"id"] <- recode_table[recode_table$old == ID,"new"]
}

但我正在寻找一个 dplyr 解决方案,而不必使用“join”系列。我想要这样的东西。

    data <- mutate(data,id = ifelse(id %in% recode_table$old,filter(recode_table,old == id) %>% pull(new),id))

显然,我不能使用表的列名(“id”)来识别新 ID。 对文档或手册中相应段落的引用也值得赞赏。提前致谢!

解决方法

您可以在命名向量上使用 recode 和不带引号的拼接 (!!!)

library(dplyr)

# vector of new IDs
recode_vec <- recode_table$new
# named with old IDs
names(recode_vec) <- recode_table$old

data %>% 
  mutate(id = recode(id,!!!recode_vec))
#     id
# 1  D78
# 2  L30
# 3  F02
# 4  A24
# 5  B46
# 6  T01
# 7  Q38
# 8  S30
# 9  K88
# 10 O04
# 11 P12
# 12 Z33