我有两个数据帧:w2p和EUpb。
我通过'Sample.ID'合并了两个数据帧,我想在合并的数据帧中创建一列,以指定每个观测值的来源(w2p或EUpb)。
我执行了以下代码,并且有效:
w2p$source <- "w2p"
EUpb$source <- "EUPb"
Merged <- merge(x = w2p, y = EUpb,
all = TRUE, by = c("Sample.ID"))
Merged$rowSource <- apply(Merged[c("source.x", "source.y")], 1,
function(x) paste(na.omit(x), collapse = ""))
但是,在合并数据帧中没有显示EUPb的Sample.ID,我不确定为什么会这样。我按样本ID合并并设置all = TRUE。参见下文:
合并的数据帧包含3575个ob,包含168个变量。这是几行的小片段,显示缺少EUPb的Sample.ID。
rowSource Sample.ID
w2p ZB01/2
w2p ZD-702/3
w2p ZD-703/2
EUPb NA
EUPb NA
EUPb NA
我们非常感谢您的帮助。
答案 0 :(得分:1)
我喜欢在进行任何合并之前将source
添加到其中一个帧中,因为归因于第一帧的那些行将被这样标识,而第二帧的行将是NA
:>
df1 <- data.frame(id = c(1L, 2L, 3L, 4L))
df2 <- data.frame(id = c(1L, 2L, 3L, 5L))
merged <- merge(transform(df1, source = "df1", stringsAsFactors = FALSE),
df2, by="id", all=TRUE)
merged
# id source
# 1 1 df1
# 2 2 df1
# 3 3 df1
# 4 4 df1
# 5 5 <NA>
merged$source <- ifelse(is.na(merged$source), "df2", merged$source)
merged
# id source
# 1 1 df1
# 2 2 df1
# 3 3 df1
# 4 4 df1
# 5 5 df2
dplyr
的替代方法,这次是在两个帧中先定义source
,然后再coalesce
定义它。
library(dplyr)
full_join(
mutate(df1, source = "df1"),
mutate(df2, source = "df2"),
by = "id"
) %>%
mutate(source = coalesce(source.x, source.y)) %>%
select(-source.x, -source.y)
# id source
# 1 1 df1
# 2 2 df1
# 3 3 df1
# 4 4 df1
# 5 5 df2