2017-09-16 44 views
0

我已經花了這一天的更好的一部分,但我一直在卡住。這不會花費我很長時間在Excel中使用索引匹配匹配,但我對R更新,並且合併數據似乎並不直截了當。我搜索了該網站,發現了類似的問題,但沒有針對此類問題的解決方案。在R中部分覆蓋合併兩個不同尺寸的數據幀

我有兩個數據幀。它們在兩個維度上都有不同的長度。 a是4x4,而b是3x3。部分重疊:

a <- data.frame("ID" = c(1:4), "A" = c(21:24), "B" = c(31:34), "C" = c(41:44)) 
a 

    ID A B C 
1 1 21 31 41 
2 2 22 32 42 
3 3 23 33 43 
4 4 24 34 44 

b <- data.frame("ID" = c(4:6), "C" = c(22:24), "D" = c(32:34)) 
b 
    ID C D 
1 4 22 32 
2 5 23 33 
3 6 24 34 

我合併的 「ID」 號碼。我的目標是讓他們看起來像

c <- data.frame("ID" = c(1:6), "A" = c(21:24, NA, NA), "B" = c(31:34, NA, NA), "C" = c(41:43,22:24), "D" = c(NA, NA, NA, 32:34)) 
c 

ID A B C D 
1 21 31 41 NA 
2 22 32 42 NA 
3 23 33 43 NA 
4 24 34 22 32 
5 NA NA 23 33 
6 NA NA 24 34 

正如你所看到的,最終的數據幀合併這兩個並分配娜缺少的信息。在「C」欄中,我想b覆蓋a它有數字值。在這個例子中,在c[4,3]值應該改變從44至22

大多數這是很簡單的。但讓列「C」正確是一場噩夢。我做了簡單的事情第一:

merge(a, b, by = "ID", all = T) 

它幾乎是卓有成效的,但與重複行個「C」結束:

ID A B C.x C.y D 
1 1 21 31 41 NA NA 
2 2 22 32 42 NA NA 
3 3 23 33 43 NA NA 
4 4 24 34 44 22 32 
5 5 NA NA NA 23 33 
6 6 NA NA NA 24 34 

這不會是如此糟糕,如果我能找出如何正確合併重複的行,因爲這樣我可以只運行

merge(a[-4], b[-2], by = "ID", all = T) 
    ID A B D 
1 1 21 31 NA 
2 2 22 32 NA 
3 3 23 33 NA 
4 4 24 34 32 
5 5 NA NA 33 
6 6 NA NA 34 

到別的合併的一切,那麼在事後合併的「C」帶來的。

但我無法弄清楚如何處理這部分內容:

merge(a[c(1,4)], b[c(1,2)], by = "ID", all = T) 
    ID C.x C.y   ID C 
1 1 41 NA  1 1 41 
2 2 42 NA  2 2 42 
3 3 43 NA -> 3 3 43 
4 4 44 22  4 4 22 
5 5 NA 23  5 5 23 
6 6 NA 24  6 6 24 

有一定有辦法。

感謝您的幫助!

+0

順便說一句,以上的數據幀是例子,你可能會意識到。我試圖合併的實際數據框大致爲2000x100和200x20,因此手動更改單個元素將無濟於事。 – trijamms

回答

0

試試這個

library(dplyr) 
starthere <- merge(a, b, by = "ID", all = T) 
starthere %>% 
    mutate(C = ifelse(is.na(C.y), C.x, C.y)) %>% 
    select(-C.x, -C.y) 


    # ID A B D C 
# 1 1 21 31 NA 41 
# 2 2 22 32 NA 42 
# 3 3 23 33 NA 43 
# 4 4 24 34 32 22 
# 5 5 NA NA 33 23 
# 6 6 NA NA 34 24 
+0

不錯。非常感謝!這似乎很好。我最近開始學習dplyr,所以這會幫助我開始理解它。再次感謝。我應該能夠將其推廣以適應需求。 – trijamms

+0

很高興幫助... – CPak

0

對於其他人在未來的看着這個,我意識到這也可以解決使用下面的base而不是dplyr

df <- merge(a, b, by = "ID", all = T) 
df[,"C"] <- ifelse(is.na(df[,"C.y"]), df[,"C.x"], df[,"C.y"]) 
df <- df[,-c(match("C.x", names(df)),match("C.y", names(df)))] 

該結束了我使用的方法,因爲在路上我才需要執行一些步驟是非常困難的dplyr對於一個新手(利用內幕mutate()select()變量)和更多strai ghtforward使用上述語法在base

再次感謝CPAK,沒有他們,我不可能想通了這一點。