2017-04-06 7 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 

と出力はそのようなものです:私は機能compareまたはmergelinkを使用しようとしていたが、私はこの結果を持っていない

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 

。この場合、私が使用できる別の機能を知っていますか?

多かれ少なかれ、Venn Diagramのようなものです。すべてが良好であることを確認するために、私がこれを行ったのとまったく同じです。

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

@Enrique、このアドレスはあなたの質問ですか? – r2evans

関連する問題