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

相关问题