【问题标题】:Merging two data frames fails to populate columns when combined合并两个数据框时无法填充列
【发布时间】:2020-02-07 21:29:51
【问题描述】:

我是使用 R 的新手。我有两个数据框(如下所示),我想在 df1 中添加来自 df2 的信息。两个数据框之间唯一的共同点是“Sample”。 所以我尝试使用此列来合并两个数据框。

df1

structure(list(Segment = c(3L, 3L, 3L, 4L, 5L, 6L, 6L, 6L, 7L, 
7L), Position = c(838L, 891L, 1204L, 732L, 1550L, 688L, 1167L, 
1446L, 950L, 981L), `AA-REF` = structure(c(2L, 5L, 7L, 6L, 1L, 
8L, 8L, 1L, 3L, 4L), .Label = c("", "D", "E", "H", "K", "L", 
"Q", "T"), class = "factor"), `AA-ALT` = structure(c(4L, 2L, 
2L, 3L, NA, 5L, 3L, NA, 1L, 4L), .Label = c("E", "K", "M", "N", 
"T"), class = "factor"), SYN = structure(c(2L, 3L, 2L, 2L, 1L, 
3L, 2L, 1L, 3L, 2L), .Label = c("     ", "N     ", "Y     "), class = "factor"), 
    Sample = c("AO103", "AO103", "AO103", "AO103", "AO103", "AO103", 
    "AO103", "AO103", "AO103", "AO103")), row.names = c(NA, 10L
), class = "data.frame")
  Segment Position AA-REF AA-ALT    SYN Sample
1         3      838      D      N N       AO103
2         3      891      K      K Y       AO103
3         3     1204      Q      K N       AO103
4         4      732      L      M N       AO103
5         5     1550          <NA>         AO103
6         6      688      T      T Y       AO103
7         6     1167      T      M N       AO103
8         6     1446          <NA>         AO103
9         7      950      E      E Y       AO103
10        7      981      H      N N       AO103
11        8      199      T      N N       AO103
12        1      341      T      K N       AO104
13        1      934      T      A N       AO104
14        1     1327      L      F N       AO104
15        1     1349      D      G N       AO104

df2

structure(list(Sample = c("AO208 ", "AO209 ", "AO210 ", "AO211 ", 
"AO212 ", "AO213 ", "AO100 ", "AO101 ", "AO102 ", "AO103 "), 
    Quail = c(7, 8, 9, 10, 11, 12, 7, 8, 9, 10), day = c(3, 3, 
    3, 3, 3, 3, 5, 5, 5, 5), Expo = structure(c(1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L), .Label = " DC ", class = "factor"), 
    Group = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L
    ), .Label = " var", class = "factor")), row.names = c(NA, 
10L), class = "data.frame")
 Sample Quail day Expo Group
1  AO208      7   3  DC    var
2  AO209      8   3  DC    var
3  AO210      9   3  DC    var
4  AO211     10   3  DC    var
5  AO212     11   3  DC    var
6  AO213     12   3  DC    var
7  AO100      7   5  DC    var
8  AO101      8   5  DC    var
9  AO102      9   5  DC    var
10 AO103     10   5  DC    var
11 AO104     11   5  DC    var

注意:并非 df2$Sample 中的所有条目都存在于 df1$Sample 中

我想得到类似以下的东西:

  Segment Position AA-REF AA-ALT    SYN Sample    Quail   day    Expo    Group
1         3      838      D      N N       AO103    10   5  DC    var
2         3      891      K      K Y       AO103    10   5  DC    var
3         3     1204      Q      K N       AO103    10   5  DC    var
4         4      732      L      M N       AO103    10   5  DC    var
5         5     1550          <NA>         AO103    10   5  DC    var
6         6      688      T      T Y       AO103    10   5  DC    var
7         6     1167      T      M N       AO103    10   5  DC    var
8         6     1446          <NA>         AO103    10   5  DC    var
9         7      950      E      E Y       AO103    10   5  DC    var
10        7      981      H      N N       AO103    10   5  DC    var
11        8      199      T      N N       AO103    10   5  DC    var
12        1      341      T      K N       AO104    11   5  DC    var
13        1      934      T      A N       AO104    11   5  DC    var
14        1     1327      L      F N       AO104    11   5  DC    var
15        1     1349      D      G N       AO104    11   5  DC    var

我试过了:

x <- merge(df1, df2, by = "Sample", all = TRUE)

即使这是添加列,df2 中的所有内容都放在 df1 的末尾。

我也尝试使用 dplyr 的 left_join(以及其他)作为:

x <- df1 %>%
  left_join(df2, by = "Sample")

这会添加来自 df2 的空列,并且根本没有任何信息。

我一直在查看许多合并帖子,但似乎都没有解决我的问题。

我也试过 match 没有成功。

【问题讨论】:

  • 只要x&lt;-left_join(df1,df2) 列名“Sample”相同,它就会为您匹配。
  • 如果您包含一个简单的reproducible example,其中包含可用于测试和验证可能解决方案的示例输入和所需输出,则更容易为您提供帮助。样本值在 df1 和 df2 中的格式是否可能不同? sum(df2$Sample %in% df1$Sample) 返回什么?
  • 谢谢@MrFlick。我希望我的更新能给你带来更好的工作。值都在 as.characters 中; sum(df2$Sample %in% df1$Sample) 返回 0。
  • 那里确实有空格!!!非常感谢我能够合并它们!!!非常感谢您抽出宝贵时间!
  • @Tanner33,对于删除周围的空白,我建议使用trimws()stringr::str_trim()。这比无条件删除最后一个字符要安全得多。

标签: r dataframe merge


【解决方案1】:
x <- merge(x=df1, y=df2, by = "Sample", all.x = TRUE)

您只需要 df1 中的所有列,因此您只需要 all.x

如果您想使用 dplyr 或 tidyverse 软件包,请向 Tanner33 求助。

【讨论】:

  • 谢谢@dyrland。我试过了,但它仍然没有合并。
猜你喜欢
  • 1970-01-01
  • 2015-12-28
  • 2020-10-20
  • 1970-01-01
  • 2017-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-28
相关资源
最近更新 更多