簡體   English   中英

R:當存在匹配值時,將值從一個數據框移動到另一個

[英]R: moving values from a dataframe to another when there are matching values

我有兩個數據框

第一個數據幀稱為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))

數據框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個Col2值,這些值不包含在數據框A,855665和800285中。

   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

有任何想法嗎?

默認情況下,R自動嘗試創建有效的列名,而數字則不是。 您可以使用data.frame語句中的check.names=FALSE阻止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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM