R 通过一个ID合并两个数据集,而不添加显示“quot;”的新列;。x";或“不”;。“是”;

R 通过一个ID合并两个数据集,而不添加显示“quot;”的新列;。x";或“不”;。“是”;,r,merge,R,Merge,假设我有两个数据集。一个包含多列元数据的主数据集和一个用于填补主数据集中某些浓度差距的新数据集: study_id timepoint age occupation concentration1 concentration2 1 1 21 0 3 7 1 2 21 0 4

假设我有两个数据集。一个包含多列元数据的主数据集和一个用于填补主数据集中某些浓度差距的新数据集:

study_id timepoint age occupation concentration1 concentration2 1 1 21 0 3 7 1 2 21 0 4 6 1 3 22 0 NA NA 1 4 22 0 NA NA 2 1 36 3 0 4 2 2 36 3 2 11 2 3 37 3 NA NA 2 4 37 3 NA NA 主要数据集:

study_id timepoint age occupation concentration1 concentration2 1 1 21 0 3 7 1 2 21 0 4 6 1 3 22 0 NA NA 1 4 22 0 NA NA 2 1 36 3 0 4 2 2 36 3 2 11 2 3 37 3 NA NA 2 4 37 3 NA NA 研究id时间点年龄职业集中度1集中度2 1 1 21 0 3 7 1 2 21 0 4 6 1 3 22 0不适用 1 4 22 0不适用 2 1 36 3 0 4 2 2 36 3 2 11 2 3 37 3 NA 2 4 37 3不适用 要合并的新数据集:

study_id timepoint concentration1 concentration2 1 3 11 20 1 4 21 35 2 3 7 17 2 4 14 25 研究id时间点集中1集中2 1 3 11 20 1 4 21 35 2 3 7 17 2 4 14 25 每当我通过“study_id”和“timepoint”进行合并时,我会得到两个新列,分别是“concentration1.y”和“concentration2.y”,而原始列会被重命名为“concentration1.x”和“concentration2.x”。我不要这个

这就是我想要的:

study_id timepoint age occupation concentration1 concentration2 1 1 21 0 3 7 1 2 21 0 4 6 1 3 22 0 11 20 1 4 22 0 21 35 2 1 36 3 0 4 2 2 36 3 2 11 2 3 37 3 7 17 2 4 37 3 14 25 研究id时间点年龄职业集中度1集中度2 1 1 21 0 3 7 1 2 21 0 4 6 1 3 22 0 11 20 1 4 22 0 21 35 2 1 36 3 0 4 2 2 36 3 2 11 2 3 37 3 7 17 2 4 37 3 14 25 换句话说,我想通过“研究id”和“时间点”合并,合并两个浓度列,使数据位于相同的列中。请注意,两个数据集没有相同的列(数据集1有1000列包含元数据,而数据集2只有研究id、时间点和浓度列与数据集1中的浓度列相匹配)


提前非常感谢。

使用
coalesce
是一种选择(来自
dplyr
软件包)。这仍然会从第二个数据帧添加浓度1和浓度2的两列。在填写
NA
后,这些将被删除

library(tidyverse)

df1 %>%
  left_join(df2, by = c("study_id", "timepoint")) %>%
  mutate(concentration1 = coalesce(concentration1.x, concentration1.y),
         concentration2 = coalesce(concentration2.x, concentration2.y)) %>%
  select(-concentration1.x, -concentration1.y, -concentration2.x, -concentration2.y)
或使用多个
浓度
列进行概括:

df1 %>%
  left_join(df2, by = c("study_id", "timepoint")) %>%
  split.default(str_remove(names(.), "\\.x|\\.y")) %>%
  map_df(reduce, coalesce)
编辑:为了防止结果列名从
拆分中按字母顺序排列。默认值
,您可以添加一个中间步骤,根据第一个数据帧的列名顺序对列表进行排序

df3 <- df1 %>%
  left_join(df2, by = c("study_id", "timepoint")) %>%
  split.default(str_remove(names(.), "\\.x|\\.y"))

df3[names(df1)] %>%
  map_df(reduce, coalesce)
数据

df1 <- structure(list(study_id = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L), 
    timepoint = c(1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L), age = c(21L, 
    21L, 22L, 22L, 36L, 36L, 37L, 37L), occupation = c(0L, 0L, 
    0L, 0L, 3L, 3L, 3L, 3L), concentration1 = c(3L, 4L, NA, NA, 
    0L, 2L, NA, NA), concentration2 = c(7L, 6L, NA, NA, 4L, 11L, 
    NA, NA)), class = "data.frame", row.names = c(NA, -8L))

df2 <- structure(list(study_id = c(1L, 1L, 2L, 2L), timepoint = c(3L, 
4L, 3L, 4L), concentration1 = c(11L, 21L, 7L, 14L), concentration2 = c(20L, 
35L, 17L, 25L)), class = "data.frame", row.names = c(NA, -4L))

df1非常感谢!这似乎奏效了。你是救命恩人。如果你能回答,我还有一个后续问题。如果我有100个浓度呢?有没有一种方法可以在不写出所有列名的情况下将此应用于100列而不是2列?@DrWampa请查看编辑后的答案,这样行吗?非常感谢。快到了。。。唯一的问题是,这会将所有列按字母顺序重新排序,而不是按df1的原始顺序。。。您最初的解决方案没有做到这一点,所以似乎是添加了map_df导致了它。。。有什么办法来对付这个问题吗?非常感谢你们的帮助。万帕博士请看编辑后的答案。在使用
map\u df
之前,您可以添加一个中间步骤,并根据
df1
的列名顺序对列表进行排序。看看这对你是否有用。非常感谢,本!解决了的!