我有两个数据帧,
第一个数据框称为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
有什么想法吗?
答案 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