2017-04-06 124 views
0

我試圖自動化我通常在Excel中完成的一個過程。這個過程由合併和比較不同的列組成。 例如:合併並比較來自不同文件的不同列

df1: 
sp|P07437|TBB5_HUMAN 
sp|P10809|CH60_HUMAN 
sp|P424|LPPRC_HUMAN 
sp|P474|LRC_HUMAN 

df2: 
sp|P07437|TBB5_HUMAN 
sp|P10809|CH60_HUMAN 
sp|P42704|LPPRC_HUMAN 

df3: 
sp|P07437|TBB5_HUMAN 
sp|P10788|CH70_HUMAN 
sp|P42704|LPPRC_HUMAN 

和輸出是類似的東西:

sp|P07437|TBB5_HUMAN | sp|P07437|TBB5_HUMAN | sp|P07437|TBB5_HUMAN 
sp|P10809|CH60_HUMAN | sp|P10809|CH60_HUMAN | 
         |      | sp|P10788|CH70_HUMAN 
sp|P424|LPPRC_HUMAN |      | 
sp|P474|LRC_HUMAN  |      | 
         | sp|P42704|LPPRC_HUMAN| sp|P42704|LPPRC_HUMAN 

我試圖使用功能comparemergelink,但我沒有這樣的結果。你知道在這種情況下可以使用的另一個函數嗎?

或多或少就像維恩圖一樣,這正是我之後所做的,以便檢查一切都很好。

enter image description here

在這裏,你是和一個可重複的例子:

df1 = data.frame(TEST1=c("sp|P07437|TBB5_HUMAN","sp|P10809|CH60_HUMAN", "sp|P424|LPPRC_HUMAN")) 

df2 = data.frame(TEST2=c("sp|P07437|TBB5_HUMAN","sp|P10809|CH60_HUMAN"," sp|P42704|LPPRC_HUMAN")) 

df3 = data.frame(TEST3=c("sp|P07437|TBB5_HUMAN","sp|P10788|CH70_HUMAN",  "sp|P42704|LPPRC_HUMAN")) 

非常感謝你。

回答

1

我使用的是稍微修改過的數據版本,避免了數據中的factor。我還修剪了額外的空白區域,假設它在複製/粘貼時出錯。

df1 = data.frame(TEST1=c("sp|P07437|TBB5_HUMAN","sp|P10809|CH60_HUMAN", "sp|P424|LPPRC_HUMAN"), 
       stringsAsFactors = FALSE) 
df2 = data.frame(TEST2=c("sp|P07437|TBB5_HUMAN","sp|P10809|CH60_HUMAN"," sp|P42704|LPPRC_HUMAN"), 
       stringsAsFactors = FALSE) 
df3 = data.frame(TEST3=c("sp|P07437|TBB5_HUMAN","sp|P10788|CH70_HUMAN",  "sp|P42704|LPPRC_HUMAN"), 
       stringsAsFactors = FALSE) 

由於這樣那樣的問題可以很容易地擴展到包括比data.frames的初始數量更多,我通常喜歡用data.frames,沒有明確的data.frames的名單的工作,如果在所有可能。

lst <- list(df1, df2, df3) 

現在,這裏有一個方法來獲得您想要的結果:

alltests <- unique(trimws(unlist(lst, recursive = TRUE))) 
as.data.frame(
    setNames(lapply(lst, function(a) alltests[ match(alltests, a[,1]) ]), 
      sapply(lst, names)), 
    stringsAsFactors = FALSE 
) 
#     TEST1    TEST2    TEST3 
# 1 sp|P07437|TBB5_HUMAN sp|P07437|TBB5_HUMAN sp|P07437|TBB5_HUMAN 
# 2 sp|P10809|CH60_HUMAN sp|P10809|CH60_HUMAN     <NA> 
# 3 sp|P424|LPPRC_HUMAN     <NA>     <NA> 
# 4     <NA>     <NA> sp|P424|LPPRC_HUMAN 
# 5     <NA>     <NA> sp|P10809|CH60_HUMAN 

這依賴於(1)單柱data.frames(儘管可以糾正);和(2)唯一的列名稱。你的建議輸出並不意味着什麼,所以我選擇不在這裏進行任何排序;使用alltests <- sort(unique(...))很容易,但請注意,它是一種字母排序,不基於子字符串的數字部分。

+0

@恩裏克,這是否解決您的問題? – r2evans

相關問題