plyr::mapvalues可以根据字典重编码向量,即在现有值和替换值的两个匹配向量基础上进行操作。
library(plyr)
data <- c("a", "b", "c", "a")
dict_old <- c("a", "b", "c")
dict_new <- c("Apple", "Banana", "Carrot")
mapvalues(data, dict_old, dict_new)
[1] "Apple" "Banana" "Carrot" "Apple"
在dplyr中,可以通过创建一个包含新值的列表,并将旧值分配为列表元素的名称来获得等效结果:
list <- as.list(dict_new)
names(list) <- dict_old
recode(data, !!!list)
[1] "Apple" "Banana" "Carrot" "Apple"
然而,我认为这种方法相当笨拙。在tidyverse内有更简洁的方法吗?
str_replace_all
的优点在于它不会将data
中存在但dict_old
中不存在的值替换为 NAs。以下是一个简短的示例,可与基础 R 版本进行比较:str_replace_all(c("x","y","z"),setNames(c("a","b"),c("x","y")))
。 - Paul Rougieux