【问题标题】:R - Join two dataframes on column containing part of stringR - 在包含部分字符串的列上加入两个数据框
【发布时间】:2019-01-22 09:50:16
【问题描述】:

我有两个数据框

df1

  Gate  Set
1  1  PIP D04 LMI1 975
2  6  PIP D06 LMI1 363
3 Time  PIP d08 LMI1 wk7 539

df2

    ID     Weeks
1  d01       6
2  d04       8
3  d06       9
4  d08       19

我想合并。如您所见,df2$ID 中的字符串作为 df1$Set 中字符串的一部分返回。 我想以匹配字符串的方式连接两个数据框,并将 df2$Weeks 中的相应值附加到新列中。像这样的:

  Gate       Set             Weeks
1  1    PIP D04 LMI1 975      8
2  6    PIP D06 LMI1 363      9
3 Time  PIP d08 LMI1 wk7 539  19

我尝试了一种方法,我使用一个函数循环,该函数拆分了不起作用的字符串。

test_day <- unlist(strsplit(df[,2][1], ""))
test_day <- paste(test_day[c(5:7)], collapse = "")

编辑:这里是两个数据帧的 dput 输出:

df1:

structure(list(Gate = structure(c(1L, 24L, 1L, 23L, 1L, 13L, 
1L, 21L, 1L, 20L, 1L, 3L, 4L, 5L, 1L, 19L, 1L, 9L, 1L, 2L, 1L, 
10L, 14L, 15L, 22L, 1L, 12L, 16L, 17L, 18L, 1L, 6L, 7L, 8L, 1L, 
11L, 1L, 24L, 1L, 23L, 1L, 13L, 1L, 21L, 1L, 20L, 1L, 3L, 4L, 
5L, 1L, 19L, 1L, 9L, 1L, 2L, 1L, 10L, 14L, 15L, 22L, 1L, 12L, 
16L, 17L, 18L, 1L, 6L, 7L, 8L, 1L, 11L, 1L, 24L, 1L, 23L, 1L, 
13L, 1L, 21L, 1L, 20L, 1L, 3L, 4L, 5L, 1L, 19L, 1L, 9L, 1L, 2L, 
1L, 10L, 14L, 15L, 22L, 1L, 12L, 16L, 17L, 18L, 1L, 6L, 7L, 8L, 
1L, 11L, 1L, 24L, 1L, 23L, 1L, 13L, 1L, 21L, 1L, 20L, 1L, 3L, 
4L, 5L, 1L, 19L, 1L, 9L, 1L, 2L, 1L, 10L, 14L, 15L, 22L, 1L, 
12L, 16L, 17L, 18L, 1L, 6L, 7L, 8L, 1L, 11L, 1L, 24L, 1L, 23L, 
1L, 13L, 1L, 21L, 1L, 20L, 1L, 3L, 4L, 5L, 1L, 19L, 1L, 9L, 1L, 
2L, 1L, 10L, 14L, 15L, 22L, 1L, 12L, 16L, 17L, 18L, 1L, 6L, 7L, 
8L, 1L, 11L, 1L, 24L, 1L, 23L, 1L, 13L, 1L, 21L, 1L, 20L, 1L, 
3L, 4L, 5L, 1L, 19L, 1L, 9L, 1L, 2L, 1L, 10L, 14L, 15L, 22L, 
1L, 12L, 16L, 17L, 18L, 1L, 6L, 7L, 8L, 1L, 11L, 1L, 24L, 1L, 
23L, 1L, 13L, 1L, 21L, 1L, 20L, 1L, 3L, 4L, 5L, 1L, 19L, 1L, 
9L, 1L, 2L, 1L, 10L, 14L, 15L, 22L, 1L, 12L, 16L, 17L, 18L, 1L, 
6L, 7L, 8L, 1L, 11L, 1L, 24L, 1L, 23L, 1L, 13L, 1L, 21L, 1L, 
20L, 1L, 3L, 4L, 5L, 1L, 19L, 1L, 9L, 1L, 2L, 1L, 10L, 14L, 15L, 
22L, 1L, 12L, 16L, 17L, 18L, 1L, 6L, 7L, 8L, 1L, 11L, 1L, 24L, 
1L, 23L, 1L, 13L, 1L, 21L, 1L, 20L, 1L, 3L, 4L, 5L, 1L, 19L, 
1L, 9L, 1L, 2L, 1L, 10L, 14L, 15L, 22L, 1L, 12L, 16L, 17L, 18L, 
1L, 6L, 7L, 8L, 1L, 11L, 1L, 24L, 1L, 23L, 1L, 13L, 1L, 21L, 
1L, 20L, 1L, 3L, 4L, 5L, 1L, 19L, 1L, 9L, 1L, 2L, 1L, 10L, 14L, 
15L, 22L, 1L, 12L, 16L, 17L, 18L, 1L, 6L, 7L, 8L, 1L, 11L, 1L, 
24L, 1L, 23L, 1L, 13L, 1L, 21L, 1L, 20L, 1L, 3L, 4L, 5L, 1L, 
19L, 1L, 9L, 1L, 2L, 1L, 10L, 14L, 15L, 22L, 1L, 12L, 16L, 17L, 
18L, 1L, 6L, 7L, 8L, 1L, 11L, 1L, 24L, 1L, 23L, 1L, 13L, 1L, 
21L, 1L, 20L, 1L, 3L, 4L, 5L, 1L, 19L, 1L, 9L, 1L, 2L, 1L, 10L, 
14L, 15L, 22L, 1L, 12L, 16L, 17L, 18L, 1L, 6L, 7L, 8L, 1L, 11L, 
1L, 24L, 1L, 23L, 1L, 13L, 1L, 21L, 1L, 20L, 1L, 3L, 4L, 5L, 
1L, 19L, 1L, 9L, 1L, 2L, 1L, 10L, 14L, 15L, 22L, 1L, 12L, 16L, 
17L, 18L, 1L, 6L, 7L, 8L, 1L, 11L, 1L, 24L, 1L, 23L, 1L, 13L, 
1L, 21L, 1L, 20L, 1L, 3L, 4L, 5L, 1L, 19L, 1L, 9L, 1L, 2L, 1L, 
10L, 14L, 15L, 22L, 1L, 12L, 16L, 17L, 18L, 1L, 6L, 7L, 8L, 1L, 
11L, 1L, 24L, 1L, 23L, 1L, 13L, 1L, 21L, 1L, 20L, 1L, 3L, 4L, 
5L, 1L, 19L, 1L, 9L, 1L, 2L, 1L, 10L, 14L, 15L, 22L, 1L, 12L, 
16L, 17L, 18L, 1L, 6L, 7L, 8L, 1L, 11L, 1L, 24L, 1L, 23L, 1L, 
13L, 1L, 21L, 1L, 20L, 1L, 3L, 4L, 5L, 1L, 19L, 1L, 9L, 1L, 2L, 
1L, 10L, 14L, 15L, 22L, 1L, 12L, 16L, 17L, 18L, 1L, 6L, 7L, 8L, 
1L, 11L, 1L, 24L, 1L, 23L, 1L, 13L, 1L, 21L, 1L, 20L, 1L, 3L, 
4L, 5L, 1L, 19L, 1L, 9L, 1L, 2L, 1L, 10L, 14L, 15L, 22L, 1L, 
12L, 16L, 17L, 18L, 1L, 6L, 7L, 8L, 1L, 11L, 1L, 24L, 1L, 23L, 
1L, 13L, 1L, 21L, 1L, 20L, 1L, 3L, 4L, 5L, 1L, 19L, 1L, 9L, 1L, 
2L, 1L, 10L, 14L, 15L, 22L, 1L, 12L, 16L, 17L, 18L, 1L, 6L, 7L, 
8L, 1L, 11L, 1L, 24L, 1L, 23L, 1L, 13L, 1L, 21L, 1L, 20L, 1L, 
3L, 4L, 5L, 1L, 19L, 1L, 9L, 1L, 2L, 1L, 10L, 14L, 15L, 22L, 
1L, 12L, 16L, 17L, 18L, 1L, 6L, 7L, 8L, 1L, 11L, 1L, 24L, 1L, 
23L, 1L, 13L, 1L, 21L, 1L, 20L, 1L, 3L, 4L, 5L, 1L, 19L, 1L, 
9L, 1L, 2L, 1L, 10L, 14L, 15L, 22L, 1L, 12L, 16L, 17L, 18L, 1L, 
6L, 7L, 8L, 1L, 11L, 1L, 24L, 1L, 23L, 1L, 13L, 1L, 21L, 1L, 
20L, 1L, 3L, 4L, 5L, 1L, 19L, 1L, 9L, 1L, 2L, 1L, 10L, 14L, 15L, 
22L, 1L, 12L, 16L, 17L, 18L, 1L, 6L, 7L, 8L, 1L, 11L, 1L, 24L, 
1L, 23L, 1L, 13L, 1L, 21L, 1L, 20L, 1L, 3L, 4L, 5L, 1L, 19L, 
1L, 9L, 1L, 2L, 1L, 10L, 14L, 15L, 22L, 1L, 12L, 16L, 17L, 18L, 
1L, 6L, 7L, 8L, 1L, 11L, 1L, 24L, 1L, 23L, 1L, 13L, 1L, 21L, 
1L, 20L, 1L, 3L, 4L, 5L, 1L, 19L, 1L, 9L, 1L, 2L, 1L, 10L, 14L, 
15L, 22L, 1L, 12L, 16L, 17L, 18L, 1L, 6L, 7L, 8L, 1L, 11L, 1L, 
24L, 1L, 23L, 1L, 13L, 1L, 21L, 1L, 20L, 1L, 3L, 4L, 5L, 1L, 
19L, 1L, 9L, 1L, 2L, 1L, 10L, 14L, 15L, 22L, 1L, 12L, 16L, 17L, 
18L, 1L, 6L, 7L, 8L, 1L, 11L, 1L, 24L, 1L, 23L, 1L, 13L, 1L, 
21L, 1L, 20L, 1L, 3L, 4L, 5L, 1L, 19L, 1L, 9L, 1L, 2L, 1L, 10L, 
14L, 15L, 22L, 1L, 12L, 16L, 17L, 18L, 1L, 6L, 7L, 8L, 1L, 11L, 
1L, 24L, 1L, 23L, 1L, 13L, 1L, 21L, 1L, 20L, 1L, 3L, 4L, 5L, 
1L, 19L, 1L, 9L, 1L, 2L, 1L, 10L, 14L, 15L, 22L, 1L, 12L, 16L, 
17L, 18L, 1L, 6L, 7L, 8L, 1L, 11L, 1L, 24L, 1L, 23L, 1L, 13L, 
1L, 21L, 1L, 20L, 1L, 3L, 4L, 5L, 1L, 19L, 1L, 9L, 1L, 2L, 1L, 
10L, 14L, 15L, 22L, 1L, 12L, 16L, 17L, 18L, 1L, 6L, 7L, 8L, 1L, 
11L), .Label = c("All", "B cell", "CD14+ CD16+", "CD14++ CD16-", 
"CD14++ CD16+", "CD16-CD56+ NK", "CD16-CD56+ NK bright", "CD16+CD56+ NKdim", 
"CD3-", "CD3+CD56- Tcells", "CD4+CD25++", "CD4+CD8- Tc", "CD45+", 
"CD56+CD3- NK cells", "CD56+CD3+ NKT cells", "CD8-CD4- Tc", "CD8+CD4- Tc", 
"CD8+CD4+ Tc", "Lymphocytes", "Monocytes", "Neutrophils", "non NK(T) cells", 
"Singlets", "Time"), class = "factor"), Set = structure(c(2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 5L, 5L, 
5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 
5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 6L, 
6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 
6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 
6L, 6L, 6L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 
7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 
7L, 7L, 7L, 7L, 7L, 7L, 7L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 
8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 
8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 9L, 9L, 9L, 9L, 9L, 
9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 
9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 10L, 
10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 
10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 
10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 
10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 
10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 
10L, 10L, 10L, 10L, 10L, 10L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 
11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 
11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 
11L, 11L, 11L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 
12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 
12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 
13L, 13L, 13L, 13L, 13L, 13L, 13L, 13L, 13L, 13L, 13L, 13L, 13L, 
13L, 13L, 13L, 13L, 13L, 13L, 13L, 13L, 13L, 13L, 13L, 13L, 13L, 
13L, 13L, 13L, 13L, 13L, 13L, 13L, 13L, 13L, 13L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 14L, 14L, 14L, 14L, 14L, 14L, 14L, 14L, 14L, 14L, 14L, 14L, 
14L, 14L, 14L, 14L, 14L, 14L, 14L, 14L, 14L, 14L, 14L, 14L, 14L, 
14L, 14L, 14L, 14L, 14L, 14L, 14L, 14L, 14L, 14L, 14L, 15L, 15L, 
15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 
15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 
15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 17L, 17L, 17L, 17L, 17L, 
17L, 17L, 17L, 17L, 17L, 17L, 17L, 17L, 17L, 17L, 17L, 17L, 17L, 
17L, 17L, 17L, 17L, 17L, 17L, 17L, 17L, 17L, 17L, 17L, 17L, 17L, 
17L, 17L, 17L, 17L, 17L, 18L, 18L, 18L, 18L, 18L, 18L, 18L, 18L, 
18L, 18L, 18L, 18L, 18L, 18L, 18L, 18L, 18L, 18L, 18L, 18L, 18L, 
18L, 18L, 18L, 18L, 18L, 18L, 18L, 18L, 18L, 18L, 18L, 18L, 18L, 
18L, 18L, 19L, 19L, 19L, 19L, 19L, 19L, 19L, 19L, 19L, 19L, 19L, 
19L, 19L, 19L, 19L, 19L, 19L, 19L, 19L, 19L, 19L, 19L, 19L, 19L, 
19L, 19L, 19L, 19L, 19L, 19L, 19L, 19L, 19L, 19L, 19L, 19L, 20L, 
20L, 20L, 20L, 20L, 20L, 20L, 20L, 20L, 20L, 20L, 20L, 20L, 20L, 
20L, 20L, 20L, 20L, 20L, 20L, 20L, 20L, 20L, 20L, 20L, 20L, 20L, 
20L, 20L, 20L, 20L, 20L, 20L, 20L, 20L, 20L, 21L, 21L, 21L, 21L, 
21L, 21L, 21L, 21L, 21L, 21L, 21L, 21L, 21L, 21L, 21L, 21L, 21L, 
21L, 21L, 21L, 21L, 21L, 21L, 21L, 21L, 21L, 21L, 21L, 21L, 21L, 
21L, 21L, 21L, 21L, 21L, 21L, 22L, 22L, 22L, 22L, 22L, 22L, 22L, 
22L, 22L, 22L, 22L, 22L, 22L, 22L, 22L, 22L, 22L, 22L, 22L, 22L, 
22L, 22L, 22L, 22L, 22L, 22L, 22L, 22L, 22L, 22L, 22L, 22L, 22L, 
22L, 22L, 22L, 23L, 23L, 23L, 23L, 23L, 23L, 23L, 23L, 23L, 23L, 
23L, 23L, 23L, 23L, 23L, 23L, 23L, 23L, 23L, 23L, 23L, 23L, 23L, 
23L, 23L, 23L, 23L, 23L, 23L, 23L, 23L, 23L, 23L, 23L, 23L, 23L, 
24L, 24L, 24L, 24L, 24L, 24L, 24L, 24L, 24L, 24L, 24L, 24L, 24L, 
24L, 24L, 24L, 24L, 24L, 24L, 24L, 24L, 24L, 24L, 24L, 24L, 24L, 
24L, 24L, 24L, 24L, 24L, 24L, 24L, 24L, 24L, 24L, 25L, 25L, 25L, 
25L, 25L, 25L, 25L, 25L, 25L, 25L, 25L, 25L, 25L, 25L, 25L, 25L, 
25L, 25L, 25L, 25L, 25L, 25L, 25L, 25L, 25L, 25L, 25L, 25L, 25L, 
25L, 25L, 25L, 25L, 25L, 25L, 25L, 26L, 26L, 26L, 26L, 26L, 26L, 
26L, 26L, 26L, 26L, 26L, 26L, 26L, 26L, 26L, 26L, 26L, 26L, 26L, 
26L, 26L, 26L, 26L, 26L, 26L, 26L, 26L, 26L, 26L, 26L, 26L, 26L, 
26L, 26L, 26L, 26L, 16L, 16L, 16L, 16L, 16L, 16L, 16L, 16L, 16L, 
16L, 16L, 16L, 16L, 16L, 16L, 16L, 16L, 16L, 16L, 16L, 16L, 16L, 
16L, 16L, 16L, 16L, 16L, 16L, 16L, 16L, 16L, 16L, 16L, 16L, 16L, 
16L), .Label = c("d31 wk 9.5 LMI1 168", "PIP D04 LMI1 975", "PIP D06 LMI1 363", 
"PIP d08 LMI1 wk7 539", "PIP d10 LMI1 wk10.4 540", "PIP D12 DPMC LMI1 789", 
"PIP d13 6.2wk LMI1", "PIP D15 LMI1 316", "PIP D19 LMI1 319", 
"PIP D21 LMI1 518", "PIP D22 LMI1 519", "PIP D23 LMI1 520", "PIP D26 LMI1 912", 
"PIP d39 wk 9.2 LMI1 094", "PIP d46 wk 8 LMI1 550", "d56 LMI1 14.3wk 2018-06-19 771", 
"PIP D05P LMI1 981", "PIP D07 LMI1 367", "PIP d11 LMI1 wk14 541", 
"PIP d14 LMI1 14wk 136", "PIP D18 LMI1 318", "PIP D20 LMI1 321", 
"PIP D24 LMI1 521", "PIP D25 LMI1 527", "PIP D27 LMI1 911", "PIP d47 wk 15.3 LMI1 554"
), class = "factor")), .Names = c("Gate", "Set"), class = "data.frame", row.names = c(NA, 
-972L))

和df2:

structure(list(ID = structure(c(1L, 2L, 3L, 4L, 6L, 5L, 7L, 8L, 
9L, 10L, 11L, 19L, 20L, 21L, 22L, 23L, 24L, 25L, 26L, 27L, 28L, 
29L, 30L, 31L, 32L, 33L, 34L, 35L, 36L, 37L, 38L, 39L, 40L, 41L, 
42L, 43L, 44L, 45L, 46L, 47L, 48L, 49L, 50L, 51L, 52L, 53L, 54L, 
55L, 56L, 57L, 58L, 59L, 60L, 61L, 62L, 63L, 64L, 65L, 66L, 67L, 
68L, 69L, 70L, 71L, 72L, 73L, 74L, 75L, 76L, 77L, 78L, 79L, 80L, 
81L, 82L, 83L, 84L, 85L, 86L, 87L, 88L, 89L, 90L, 91L, 92L, 93L, 
94L, 95L, 96L, 97L, 98L, 99L, 100L, 101L, 102L, 103L, 104L, 105L, 
106L, 107L, 12L, 13L, 14L, 15L, 16L, 17L, 18L), .Label = c("d01", 
"d02", "d03", "d04", "d05B", "d05P", "d06", "d07", "d08", "d09", 
"d10", "d100", "d101", "d102", "d103", "d104", "d105", "d106", 
"d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", 
"d20", "d21", "d22", "d23", "d24", "d25", "d26", "d27", "d28", 
"d29", "d30", "d31", "d32", "d33", "d34", "d35", "d36", "d37", 
"d38", "d39", "d40", "d41", "d42", "d43", "d44", "d45", "d46", 
"d47", "d48", "d49", "d50", "d51", "d52", "d53", "d54", "d55", 
"d56", "d57", "d58", "d59", "d60", "d61", "d62", "d63", "d64", 
"d65", "d66", "d67", "d68", "d69", "d70", "d71", "d72", "d73", 
"d74", "d75", "d76", "d77", "d78", "d79", "d80", "d81", "d82", 
"d83", "d84", "d85", "d86", "d87", "d88", "d89", "d90", "d91", 
"d92", "d93", "d94", "d95", "d96", "d97", "d98", "d99"), class = "factor"), 
    Weeks = c(6.7, 8.4, 6.3, 8, 15.9, 15.9, 8.9, 16.3, 7, 8, 
    10.6, 14, 10, 6.3, 14, 6.9, NA, 16, 16, 7.3, 13, 5, 6, 7, 
    14.4, 14.4, 7, 13.4, 6, 6, 14.3, 9.7, 14.3, 5.7, 7.3, 8.1, 
    6, 15.4, 7.4, 9.3, 13.6, 5.9, 5.4, 7.7, 13, 13.3, 8, 15.4, 
    16, 7, 14.1, 6.7, 13.1, 6, 6, 10.6, 14.4, 5, 6.7, 7.9, 12.4, 
    7.6, 14, 6, 13.6, 13.6, 7.3, 9, 16, 16.3, 4.7, 5, 5.9, 6, 
    8, 11.6, 6, 6.4, 8.1, 8.1, 7, 7.3, 9.6, 13.3, 6, 5, 11, 11, 
    17, 6.3, 8.3, 11.3, 14.3, 4.9, 5.9, 8.4, 5.4, 7, 15.6, 6.1, 
    4.7, 10.9, 10.4, 6, 7.3, 8.9, 11)), .Names = c("ID", "Weeks"
), class = "data.frame", row.names = c(NA, -107L))

【问题讨论】:

  • 欢迎来到 SO!您可以与dput 分享您的数据吗?在问题的末尾发布dput(df1)dput(df2) 的输出。
  • 我为 dfs 添加了两个 dput 输出。

标签: r dataframe join merge


【解决方案1】:

一种选择是使用库 fuzzyjoin 中的 regex_left_join,它允许在列条目的正则表达式匹配上合并数据集:

library(fuzzyjoin)
library(dplyr)
regex_left_join(df1, df2, by = c("Set" = "ID"), ignore_case = T) %>%
    select(-ID)
#  Gate                  Set Weeks
#1    1     PIP D04 LMI1 975     8
#2    6     PIP D06 LMI1 363     9
#3 Time PIP d08 LMI1 wk7 539    19

样本数据

df1 <- read.table(text =
    "  Gate  Set
1  1  'PIP D04 LMI1 975'
2  6  'PIP D06 LMI1 363'
3 Time  'PIP d08 LMI1 wk7 539'", header = T)

df2 <- read.table(text =
    "    ID     Weeks
1  d01       6
2  d04       8
3  d06       9
4  d08       19", header = T)

更新

使用更新后的样本数据

regex_left_join(df1, df2, by = c("Set" = "ID"), ignore_case = T) %>%
    select(-ID)
                    Gate                            Set Weeks
1                    All               PIP D04 LMI1 975   8.0
2                   Time               PIP D04 LMI1 975   8.0
3                    All               PIP D04 LMI1 975   8.0
4               Singlets               PIP D04 LMI1 975   8.0
5                    All               PIP D04 LMI1 975   8.0
6                  CD45+               PIP D04 LMI1 975   8.0
7                    All               PIP D04 LMI1 975   8.0
8            Neutrophils               PIP D04 LMI1 975   8.0
9                    All               PIP D04 LMI1 975   8.0
10             Monocytes               PIP D04 LMI1 975   8.0
....

【讨论】:

    【解决方案2】:

    使用data.table

    df1[, ID := tolower(gsub(".+([dD]\\d{2}).+", "\\1", Set))]
    df1
    #   Gate                  Set  ID
    #1:    1     PIP D04 LMI1 975 d04
    #2:    6     PIP D06 LMI1 363 d06
    #3: Time PIP d08 LMI1 wk7 539 d08
    df2[df1, on = .(ID)]
    #    ID Weeks Gate                  Set
    #1: d04     8    1     PIP D04 LMI1 975
    #2: d06     9    6     PIP D06 LMI1 363
    #3: d08    19 Time PIP d08 LMI1 wk7 539
    
    # with merge()
    merge(df1, df2, by = "ID")
    

    数据

    df1 <- fread("Gate,  Set
      1,  PIP D04 LMI1 975
      6,  PIP D06 LMI1 363
     Time,  PIP d08 LMI1 wk7 539")
    
    df2 <- fread("ID     Weeks
    d01       6
    d04       8
    d06       9
    d08       19")
    

    【讨论】:

      猜你喜欢
      • 2021-03-17
      • 1970-01-01
      • 1970-01-01
      • 2016-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-04
      • 2018-07-08
      相关资源
      最近更新 更多