[英]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)
我得到了五個數據框。 現在,我將展示我想要的數據幀a4
和a5
。 首先,我使用下一個代碼將a4
與a1
, a2
, a3
和a4
合並:
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
包中的lapply
或llply
。 全局的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.