【问题标题】:Merge and compare different columns from different files合并和比较来自不同文件的不同列
【发布时间】:2017-09-02 03:46:01
【问题描述】:

我正在尝试自动化我通常在 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"))

非常感谢。

【问题讨论】:

    标签: r merge multiple-columns


    【解决方案1】:

    我使用的是稍微修改过的数据版本,避免了数据中的factors。我还修剪了额外的空白,假设这是复制/粘贴的错误。

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

    【讨论】:

    • @Enrique,这能解决你的问题吗?
    猜你喜欢
    • 2021-01-16
    • 1970-01-01
    • 1970-01-01
    • 2013-10-22
    • 2021-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多