我认为这可能是一个“加入”(合并)操作。
library(dplyr)
set.seed(2)
mt <- sample_n(mtcars, 6)
mt
# mpg cyl disp hp drat wt qsec vs am gear carb
# Toyota Corona 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1
# Cadillac Fleetwood 10.4 8 472.0 205 2.93 5.250 17.98 0 0 3 4
# Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1
# Ferrari Dino 19.7 6 145.0 175 3.62 2.770 15.50 0 1 5 6
# Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
# Chrysler Imperial 14.7 8 440.0 230 3.23 5.345 17.42 0 0 3 4
newgears <- data.frame(gear = c(2, 3, 4), newgear = c(22, 33, 44))
newgears
# gear newgear
# 1 2 22
# 2 3 33
# 3 4 44
前提是您有一帧具有从原始值 (gear) 到新值 (newgear) 的映射。并非所有现有的gear 值都需要存在于newgears 中(我们会处理),如果在这个新框架中有额外的gear 值也不会有问题,因为它们将被忽略。
有了这个,
left_join(mt, newgears, by = "gear")
# mpg cyl disp hp drat wt qsec vs am gear carb newgear
# 1 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1 33
# 2 10.4 8 472.0 205 2.93 5.250 17.98 0 0 3 4 33
# 3 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1 33
# 4 19.7 6 145.0 175 3.62 2.770 15.50 0 1 5 6 NA
# 5 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2 44
# 6 14.7 8 440.0 230 3.23 5.345 17.42 0 0 3 4 33
由此,请注意我们有一个gear 值未映射到newgear。这是可以预料的,也是正常的,我们只需要考虑它。在我们的例子中,我们将coalesce 先newgear 然后gear;它的作用是使用newgear,除非它是NA,在这种情况下使用gear。
left_join(mt, newgears, by = "gear") %>%
mutate(gear = coalesce(newgear, gear)) %>%
select(-newgear)
# mpg cyl disp hp drat wt qsec vs am gear carb
# 1 21.5 4 120.1 97 3.70 2.465 20.01 1 0 33 1
# 2 10.4 8 472.0 205 2.93 5.250 17.98 0 0 33 4
# 3 18.1 6 225.0 105 2.76 3.460 20.22 1 0 33 1
# 4 19.7 6 145.0 175 3.62 2.770 15.50 0 1 5 6
# 5 24.4 4 146.7 62 3.69 3.190 20.00 1 0 44 2
# 6 14.7 8 440.0 230 3.23 5.345 17.42 0 0 33 4
我相信使用映射框架(此处为newgears)更容易维护和可视化,更不用说代码和在多种方式和地方使用。