如何重新映射数据框中的多列?

How to remap multiple columns in data frame?

我有一个数据框:

df <- as.data.frame(matrix(LETTERS[sample(1:5, 15, replace = TRUE)], 5, 3))
df
  V1 V2 V3
1  C  C  A
2  C  D  B
3  E  B  E
4  D  D  C
5  C  D  E

我想根据地图重新映射它的所有值,例如像这个:

map <- data.frame(id = 1:5, value = LETTERS[1:5])
map
  id value
1  1     A
2  2     B
3  3     C
4  4     D
5  5     E

获取输出:

  V1 V2 V3
1  3  3  1
2  3  4  2
3  5  2  5
4  4  4  3
5  3  4  5

我已经做到了:

df_id <- as.data.frame(sapply(df, recode, !!! setNames(map$id, map$value)))

...但当数据帧很大时,它是地球上最慢的方法。 有什么更好的方法吗? 谢谢!

你可以使用match-

df[] <- lapply(df, function(x) map$id[match(x, map$value)])

在你的方法中,我认为 recode 使过程变慢,从命名向量中提取值应该很快。

lookup <- setNames(map$id, map$value)
df[] <- lapply(df, function(x) lookup[x])
df