合并和比较来自不同文件的不同列

Merge and compare different columns from different files

我正在尝试将我通常在 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 但我没有得到这个结果。你知道我可以在这种情况下使用的另一个功能吗?

或多或少有点像维恩图,这正是我在此之后所做的,以检查一切是否良好。

这是一个可重现的例子:

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"))

非常感谢。

我使用的是您数据的略微修改版本,避免了数据中的 factors。我还修剪了额外的白色-space,假设这是 copy/paste.

中的错误
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(...)) 很容易,但请注意它是按字母顺序排序,而不是基于子字符串的数字部分。