我有2个这样的数据帧:
mydf <- data.frame(a=sample(1:10, 20, replace=T), b=sample(1:10, 20, replace=T), c=sample(1:10, 20, replace=T))
mydf
a b c
1 10 2 5
2 9 3 10
3 5 3 6
4 5 7 8
5 9 4 3
6 10 10 2
7 6 10 7
8 9 9 5
9 7 5 8
10 10 3 2
11 9 10 4
12 3 4 7
13 7 6 5
14 5 9 7
15 9 9 9
16 5 5 2
17 9 8 4
18 1 9 9
19 7 8 7
20 2 10 7
codetable <- data.frame(code=1:10, translation=LETTERS[1:10])
codetable
code translation
1 1 A
2 2 B
3 3 C
4 4 D
5 5 E
6 6 F
7 7 G
8 8 H
9 9 I
10 10 J
我不知道第一个数据帧可能有多少列...
我在这里想要做的是在mydf
的指导下,用相应的translation
字母替换codetable
中的数字。
我曾考虑合并mydf
中每一列的2个数据帧,但是使用apply
可能会有更好的解决方案。
这是我的尝试:
for (n in dim(mydf)[2]){
mydf <- merge(mydf, codetable, by.x=names(mydf)[n], by.y='code')
}
mydf
c a b translation
1 1 8 1 A
2 1 6 9 A
3 2 3 7 B
4 2 3 10 B
5 2 1 10 B
6 3 10 7 C
7 3 7 9 C
8 4 7 10 D
9 5 10 3 E
10 5 9 2 E
11 6 9 4 F
12 7 8 6 G
13 7 6 4 G
14 7 4 6 G
15 8 5 6 H
16 8 9 5 H
17 8 4 9 H
18 8 3 4 H
19 8 3 6 H
20 9 5 6 I
但是我的问题是,我没有得到translation
,a
和b
的3个c
列,而是得到了一个...
如何以一种有效的有效方式做到这一点?谢谢!
答案 0 :(得分:3)
我们可以在.row-data
和lapply
的所有列中使用mydf
,并在match
的{{1}}列中使用mydf
得到相应的code
。
codetable
这可以扩展为任意数量的列,而无需更改代码。
数据
translation
答案 1 :(得分:1)
将stack
+ unstack
与match
一起使用
mydf = stack(mydf)
mydf$values = codetable$translation[match(mydf$values,codetable$code)]
mydf = unstack(mydf)
mydf
a b c
1 A D G
2 E C H
3 G G D
4 G H I
5 A D J
6 C F E
7 I A J
8 E E H
9 B F F
10 B I G
11 F B G
12 A H H
13 B D C
14 C H G
15 I H D
16 F B G
17 G I D
18 G A I
19 F G A
20 J A D
答案 2 :(得分:1)
类似于罗纳克的答案,但使用dplyr::mutate_all
library(dplyr)
mydf %>% mutate_all(funs(codetable$translation[match(., codetable$code)]))