【发布时间】: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<-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()。这比无条件删除最后一个字符要安全得多。