我正在尝试自动化我通常在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
我试图使用函数compare
或merge
link,但我没有这个结果。你知道在这种情况下我可以使用的其他功能吗?
或多或少就像维恩图一样,这正是我在此之后所做的,以便检查一切都是好的。
这是一个可重复的例子:
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"))
非常感谢你。
答案 0 :(得分: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(...))
很容易,但请注意它是字母排序,不是基于子串的数字部分。