合并和比较来自不同文件的不同列
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
我试图使用函数 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"))
非常感谢。
我使用的是您数据的略微修改版本,避免了数据中的 factor
s。我还修剪了额外的白色-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(...))
很容易,但请注意它是按字母顺序排序,而不是基于子字符串的数字部分。
我正在尝试将我通常在 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"))
非常感谢。
我使用的是您数据的略微修改版本,避免了数据中的 factor
s。我还修剪了额外的白色-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(...))
很容易,但请注意它是按字母顺序排序,而不是基于子字符串的数字部分。