当我通过ID合并两个数据帧时,我没有获得其中一个数据帧的ID

时间:2019-11-19 19:24:53

标签: r

我有两个数据帧: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

我们非常感谢您的帮助。

1 个答案:

答案 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