根据使用 dplyr (R) 查找 table 重新编码值
Recode values based on look up table with dplyr (R)
一个相对琐碎的问题困扰了我一段时间,但我还没有找到答案 - 可能是因为我无法用语言表达搜索引擎的问题。
这是包含标识符的数据框列。
data <- data.frame("id" = c("D78", "L30", "F02", "A23", "B45", "T01", "Q38", "S30", "K84", "O04", "P12", "Z33"))
根据查找 table,过时的标识符将被重新编码为新的标识符。这是一个查找 table.
的示例
recode_table <- data.frame("old" = c("A23", "B45", "K84", "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"]
}
但我正在寻找无需使用“join”系列的 dplyr 解决方案。我想要这样的东西。
data <- mutate(data, id = ifelse(id %in% recode_table$old, filter(recode_table, old == id) %>% pull(new), id))
但显然,我不能使用 table 的列名(“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
一个相对琐碎的问题困扰了我一段时间,但我还没有找到答案 - 可能是因为我无法用语言表达搜索引擎的问题。
这是包含标识符的数据框列。
data <- data.frame("id" = c("D78", "L30", "F02", "A23", "B45", "T01", "Q38", "S30", "K84", "O04", "P12", "Z33"))
根据查找 table,过时的标识符将被重新编码为新的标识符。这是一个查找 table.
的示例recode_table <- data.frame("old" = c("A23", "B45", "K84", "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"]
}
但我正在寻找无需使用“join”系列的 dplyr 解决方案。我想要这样的东西。
data <- mutate(data, id = ifelse(id %in% recode_table$old, filter(recode_table, old == id) %>% pull(new), id))
但显然,我不能使用 table 的列名(“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