如何重新映射数据框中的多列?
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
我有一个数据框:
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