簡體   English   中英

在R中合並到單個數據幀和一個數據幀列表上的不同結果

[英]Different results applying merge in R over individual data frames and over one list of data frames

大家好,我正在處理R中的數據幀列表,我想一個一個地合並它們。 我發現一種解決方案是將Reduce()函數與merge()但是當我一一合並數據幀時卻沒有得到相同的結果。 我的數據幀列表是global ,它具有下一個結構(我在最后一部分中包括了列表的dput()版本):

global
$a1
   ID Value Products z1
1 001     1        3  1
2 002     2        2  1
3 003     3        0  1
4 004     4        1  1
5 005     5        1  1
6 006     6        6  1
7 007     7        7  1
8 009     8        1  1
9 010     9        1  1

$a2
    ID Value Products z2
1  001     1        3  2
2  002     2        2  2
3  003     3        0  2
4  004     4        1  2
5  005     5        1  2
6  006     6        6  2
7  011    10        5  2
8  012    11        5  2
9  007     7        7  2
10 009     8        1  2
11 010     9        1  2

$a3
    ID Value Products z3
1  001     1        3  3
2  002     2        2  3
3  012    11        5  3
4  013    11        1  3
5  014    11        2  3
6  003     3        0  3
7  004     4        1  3
8  005     5        1  3
9  006     6        6  3
10 007     7        7  3
11 009     8        1  3
12 010     9        1  3
13 011    10        5  3

$a4
    ID Value Products z4
1  001     1        3  4
2  002     2        2  4
3  012    11        5  4
4  013    11        1  4
5  014    11        2  4
6  003     3        0  4
7  004     4        1  4
8  005     5        1  4
9  006     6        6  4
10 007     7        7  4
11 009     8        1  4
12 010     9        1  4
13 011    10        5  4
14 015    12        3  4
15 016    12        3  4

$a5
    ID Value Products z5
1  001     1        3  5
2  002     2        2  5
3  003     3        0  5
4  004     4        1  5
5  016    12        3  5
6  017    14        2  5
7  005     5        1  5
8  006     6        6  5
9  007     7        7  5
10 009     8        1  5
11 010     9        1  5
12 011    10        5  5
13 012    11        5  5
14 013    11        1  5
15 014    11        2  5
16 015    12        3  5
17 018    14        2  5

我將所有數據框與它們之前的數據框global合並,為此,我使用下一個代碼創建了一個名為listag的新列表:

listag=Reduce(function(x, y) merge(x,y[,c(1,4)],by=intersect(names(x)[1],names(y)[1]),all.x=TRUE),global,accumulate=TRUE)

我在merge()使用了all.x=TRUE參數,因為我想在每個數據幀中保留其原始行數( a1 = 9, a2 = 11, a3 = 13, a4 = 15, a5 = 17)。 此后,我將global數據分成單獨的數據幀,以檢查最后的代碼是否工作正常,並發現了差異。 為了分離數據幀,我使用了以下代碼:

list2env(global, envir=.GlobalEnv)

我得到了五個數據框。 現在,我將展示我想要的數據幀a4a5 首先,我使用下一個代碼將a4a1a2a3a4合並:

Final41=merge(a4,a1[,c(1,4)],by=intersect(names(a4)[1],names(a1)[1]),all.x=TRUE)
Final42=merge(Final41,a2[,c(1,4)],by=intersect(names(Final41)[1],names(a2)[1]),all.x=TRUE)
Final43=merge(Final42,a3[,c(1,4)],by=intersect(names(Final42)[1],names(a3)[1]),all.x=TRUE)
Final4=merge(Final43,a4[,c(1,4)],by=intersect(names(Final43)[1],names(a4)[1]),all.x=TRUE)

此代碼的結果是:

Final4

    ID Value Products z4.x z1 z2 z3 z4.y
1  001     1        3    4  1  2  3    4
2  002     2        2    4  1  2  3    4
3  003     3        0    4  1  2  3    4
4  004     4        1    4  1  2  3    4
5  005     5        1    4  1  2  3    4
6  006     6        6    4  1  2  3    4
7  007     7        7    4  1  2  3    4
8  009     8        1    4  1  2  3    4
9  010     9        1    4  1  2  3    4
10 011    10        5    4 NA  2  3    4
11 012    11        5    4 NA  2  3    4
12 013    11        1    4 NA NA  3    4
13 014    11        2    4 NA NA  3    4
14 015    12        3    4 NA NA NA    4
15 016    12        3    4 NA NA NA    4

其中all.x=TRUE的參數可以正常工作,因為我將原始觀測值保留在a4 (15)中。 當我提取listag的第四個元素時,我得到了:

f4l=listag[[4]]
f4l

  ID  Value Products z1 z2 z3 z4
1 001     1        3  1  2  3  4
2 002     2        2  1  2  3  4
3 003     3        0  1  2  3  4
4 004     4        1  1  2  3  4
5 005     5        1  1  2  3  4
6 006     6        6  1  2  3  4
7 007     7        7  1  2  3  4
8 009     8        1  1  2  3  4
9 010     9        1  1  2  3  4

對於Reduce()函數中的merge() ,我也在考慮all.x=TRUE但是我沒有得到相同的結果,並且觀察次數錯誤。 我想在應用Reduce()merge()的組合后得到Final4的結果。 這是一個數據幀的其余部分相同listag申請后Reduce()merge()合並了global 我想為listag每個數據框獲取此結果(在本例中為第4個數據框):

   ID  Value Products  z1 z2 z3  z4
1  001     1        3  1  2  3    4
2  002     2        2  1  2  3    4
3  003     3        0  1  2  3    4
4  004     4        1  1  2  3    4
5  005     5        1  1  2  3    4
6  006     6        6  1  2  3    4
7  007     7        7  1  2  3    4
8  009     8        1  1  2  3    4
9  010     9        1  1  2  3    4
10 011    10        5 NA  2  3    4
11 012    11        5 NA  2  3    4
12 013    11        1 NA NA  3    4
13 014    11        2 NA NA  3    4
14 015    12        3 NA NA NA    4
15 016    12        3 NA NA NA    4

當我結合使用Reduce()merge()時,我不知道我的代碼有什么問題。 我考慮當我一一合並數據幀時, all.x=TRUE相等。 你能幫我這個忙嗎? 也許我必須在Reduce()merge()的組合中添加另一個參數以獲得我的結果,或者還有其他方法,例如在global使用plyr包中的lapplyllply 全局的dput()版本是下一個:

structure(list(a1 = structure(list(ID = c("001", "002", "003", 
"004", "005", "006", "007", "009", "010"), Value = c(1, 2, 3, 
4, 5, 6, 7, 8, 9), Products = c(3, 2, 0, 1, 1, 6, 7, 1, 1), z1 = c(1, 
1, 1, 1, 1, 1, 1, 1, 1)), .Names = c("ID", "Value", "Products", 
"z1"), row.names = c(NA, 9L), class = "data.frame"), a2 = structure(list(
    ID = c("001", "002", "003", "004", "005", "006", "011", "012", 
    "007", "009", "010"), Value = c(1, 2, 3, 4, 5, 6, 10, 11, 
    7, 8, 9), Products = c(3, 2, 0, 1, 1, 6, 5, 5, 7, 1, 1), 
    z2 = c(2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2)), .Names = c("ID", 
"Value", "Products", "z2"), row.names = c(NA, 11L), class = "data.frame"), 
    a3 = structure(list(ID = c("001", "002", "012", "013", "014", 
    "003", "004", "005", "006", "007", "009", "010", "011"), 
        Value = c(1, 2, 11, 11, 11, 3, 4, 5, 6, 7, 8, 9, 10), 
        Products = c(3, 2, 5, 1, 2, 0, 1, 1, 6, 7, 1, 1, 5), 
        z3 = c(3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3)), .Names = c("ID", 
    "Value", "Products", "z3"), row.names = c(NA, 13L), class = "data.frame"), 
    a4 = structure(list(ID = c("001", "002", "012", "013", "014", 
    "003", "004", "005", "006", "007", "009", "010", "011", "015", 
    "016"), Value = c(1, 2, 11, 11, 11, 3, 4, 5, 6, 7, 8, 9, 
    10, 12, 12), Products = c(3, 2, 5, 1, 2, 0, 1, 1, 6, 7, 1, 
    1, 5, 3, 3), z4 = c(4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
    4, 4)), .Names = c("ID", "Value", "Products", "z4"), row.names = c(NA, 
    15L), class = "data.frame"), a5 = structure(list(ID = c("001", 
    "002", "003", "004", "016", "017", "005", "006", "007", "009", 
    "010", "011", "012", "013", "014", "015", "018"), Value = c(1, 
    2, 3, 4, 12, 14, 5, 6, 7, 8, 9, 10, 11, 11, 11, 12, 14), 
        Products = c(3, 2, 0, 1, 3, 2, 1, 6, 7, 1, 1, 5, 5, 1, 
        2, 3, 2), z5 = c(5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
        5, 5, 5, 5, 5)), .Names = c("ID", "Value", "Products", 
    "z5"), row.names = c(NA, 17L), class = "data.frame")), .Names = c("a1", 
"a2", "a3", "a4", "a5")) 

非常感謝您的幫助。

幾件事:

*首先,由於精簡合並和手動合並*的執行順序不同,通常會給出不同的結果。 減少過程1:4,由於某種原因我不太了解,在您的手冊中合並了您的表演4,1,2,3,4。

其次,您觀察到的區別是a4表具有其他ID,並且由於使用all.x = TRUE而在簡化合並中丟失了,因為a4表是“ y”表。 因此,您應該使用all = TRUE代替:

listag <- Reduce(function(x, y) merge(x, y[, c(1, 4)],
          by = intersect(names(x)[1], names(y)[1]), all = TRUE), global)

暫無
暫無

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

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