当分配规则存储在另一个 tibble 中时,如何用新值替换 tibble 中的数据?

How to replace data in tibble with new values when the assignment rule is stored in another tibble?

提问人:Finn Jonas 提问时间:11/7/2021 更新时间:11/7/2021 访问量:129

问:

我有数据。但是,该数据的值应该被新值覆盖/替换。分配规则也存储在 tibble 中。 数据提示:

library(tidyverse)
old_data <- tibble(
  var1   = c(2,2,5,4,9,7,8,9,2),
  var2 = c(9,2,7,5,5,8,4,9,9)
)

包含有关分配规则的信息:

assignment_rule <- tibble(
  new   = c(1,2,3,4,5,6),
  old = c(2,4,5,7,8,9)
)

我知道我可以通过将每个旧号码单独分配给其新号码来解决这个例子,例如:

new_data <- old_data
new_data[new_data == 2] <- 1
new_data[new_data == 4] <- 2
new_data[new_data == 5] <- 3
new_data[new_data == 7] <- 4
new_data[new_data == 8] <- 5
new_data[new_data == 9] <- 6

但我相信有一种更优雅的方法可以做到这一点。特别是对于处理更大的数据。

非常感谢您的帮助。

r 替换 赋值运算符

评论


答:

1赞 akrun 11/7/2021 #1

使用命名向量进行匹配和重新编码

library(dplyr)
library(tibble)
new_data <- old_data  %>%
    mutate(across(everything(),
          ~deframe(assignment_rule[2:1])[as.character(.)]))

-输出

new_data
# A tibble: 9 × 2
   var1  var2
  <dbl> <dbl>
1     1     6
2     1     1
3     3     4
4     2     3
5     6     3
6     4     5
7     5     2
8     6     6
9     1     6