R:当存在匹配值时,将值从数据帧移动到另一个数据帧

时间:2017-10-06 16:26:29

标签: r dataframe

我有两个数据帧,

第一个数据框称为A:

A = data.frame(Col1 = c('2017Q1','2017Q1','2017Q1',
                        '2017Q2','2017Q2','2017Q2',
                        '2017Q3','2017Q3','2017Q3'),
               Col2=c('800256','855625','855450',
                      '800256','855625','855450',
                      '800256','855625','855450'),
               Col3=c(0.4,0.6,0.7,1.2,2.5,3.5,0.2,1.3,1.2))

Dataframe A:

   Col1  Col2   Col3
1 2017Q1 800256 0.4
2 2017Q1 855625 0.6
3 2017Q1 855450 0.7
4 2017Q2 800256 1.2
5 2017Q2 855625 2.5
6 2017Q2 855450 3.5
7 2017Q3 800256 0.2
8 2017Q3 855625 1.3
9 2017Q3 855450 1.2

第二个数据框称为B:

B = data.frame(Col2=c('800256','855665','855450',
                      '800285','855625'),
               '2017Q1'=c(0.6,1.2,3.5,0.2,1.3),
               '2017Q2'=c(0.9,1.3,5.6,1.1,2.9),
               '2017Q3'=c(6.5,1.2,4.7,1.1,9.8))

[!!!!]:在原始B表中,最后3列的名称是2017Q1,2017Q2和2017Q3但是如果执行上面的代码,则列的名称具有形成X2017Q1,X2017Q2和X2017Q3。

此外,数据帧B还包含2个未包含在数据帧A,855665和800285中的Col2值。

   Col2 2017Q1 2017Q2 2017Q3 
1 800256 0.6   0.9    6.5
2 855665 1.2   1.3    1.2
3 855450 3.5   5.6    4.7
4 800285 0.2   1.1    1.1
5 855625 1.3   2.9    9.8

我想要做的是在数据框A(Col4)中创建一个新列,它将包含来自数据框B的2017Q1到2017Q3列的值,仅用于两个表之间匹配的Col2值,因此仅适用于800256,855625 ,和855450.

因此,表A将具有最终形式:

   Col1  Col2   Col3 Col4
1 2017Q1 800256 0.4  0.6
2 2017Q1 855625 0.6  1.3
3 2017Q1 855450 0.7  3.5
4 2017Q2 800256 1.2  0.9
5 2017Q2 855625 2.5  2.9
6 2017Q2 855450 3.5  5.6
7 2017Q3 800256 0.2  6.5
8 2017Q3 855625 1.3  9.8
9 2017Q3 855450 1.2  4.7

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

默认情况下,R会自动尝试创建有效的列名,而数字则不会。您可以在check.names=FALSE语句中使用data.frame阻止R执行此操作。

B <- data.frame(Col2=c('800256','855665','855450',
                      '800285','855625'),
               '2017Q1'=c(0.6,1.2,3.5,0.2,1.3),
               '2017Q2'=c(0.9,1.3,5.6,1.1,2.9),
               '2017Q3'=c(6.5,1.2,4.7,1.1,9.8), check.names=FALSE)
require(reshape2)
B2 <- melt(B, id="Col2")

然后merge其中年/季和Col2相等

 df1 <- merge(A,B2, by.x=c("Col1", "Col2"),by.y=c("variable","Col2"),all.x=TRUE)

names(df1) <- c("Col1", "Col2", "Col3", "Col4")

    Col1   Col2 Col3  Col4
1 2017Q1 800256  0.4   0.6
2 2017Q1 855450  0.7   3.5
3 2017Q1 855625  0.6   1.3
4 2017Q2 800256  1.2   0.9
5 2017Q2 855450  3.5   5.6
6 2017Q2 855625  2.5   2.9
7 2017Q3 800256  0.2   6.5
8 2017Q3 855450  1.2   4.7
9 2017Q3 855625  1.3   9.8