循环将两个数据帧合并为其中一个的每一列

时间:2018-12-11 03:05:13

标签: r dataframe merge apply

我有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

但是我的问题是,我没有得到translationab的3个c列,而是得到了一个...

如何以一种有效的有效方式做到这一点?谢谢!

3 个答案:

答案 0 :(得分:3)

我们可以在.row-datalapply的所有列中使用mydf,并在match的{​​{1}}列中使用mydf得到相应的code

codetable

这可以扩展为任意数量的列,而无需更改代码。

数据

translation

答案 1 :(得分:1)

stack + unstackmatch一起使用

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)]))