使用grep R连接两个 Dataframe

c6ubokkw  于 2023-03-27  发布在  其他
关注(0)|答案(2)|浏览(128)

看到一些帖子展示了一些接近我需要的东西,但没有一个是完全正确的。
我有一个英国邮政编码的df:

df <- data.frame(ID = c("FK5 4JU", "FK2 9LD", "KA7 3XB", "ML1 2ND", "KA4 8DB", "ML1 5DD"),
                 var1 = c('a', 'b', 'c', 'c', 'd', 'e'),
                 var2 = c(1, 1, 1, 0, 1, 1))

我尝试将其加入另一个 Dataframe (df2),其中只包含邮政编码的第一部分:

df2 <- data.frame(ID = c("FK5 4", "FK2 9", "KA7 3", "ML1 2", "KA4 8", "ML1 5"),
                  cat = c(6,6,4,5,4,5))

理想情况下使用left_join()和grepl()的组合。

3htmauhk

3htmauhk1#

我们可以使用{powerjoin}包:

library(powerjoin)
df |>
  power_left_join(df2,
                  by = ~ substr(.x$ID, 0 ,5) == .y$ID)

#>      ID.x var1 var2  ID.y cat
#> 1 FK5 4JU    a    1 FK5 4   6
#> 2 FK2 9LD    b    1 FK2 9   6
#> 3 KA7 3XB    c    1 KA7 3   4
#> 4 ML1 2ND    c    0 ML1 2   5
#> 5 KA4 8DB    d    1 KA4 8   4
#> 6 ML1 5DD    e    1 ML1 5   5

正如@moodymudskipper在评论中建议的那样,我们也可以使用stringr::str_start()

df |>
  power_left_join(df2,
                  by = ~ stringr::str_starts(.x$ID, .y$ID))

来自OP的数据:

df <- data.frame(ID = c("FK5 4JU", "FK2 9LD", "KA7 3XB", "ML1 2ND", "KA4 8DB", "ML1 5DD"),
                 var1 = c('a', 'b', 'c', 'c', 'd', 'e'),
                 var2 = c(1, 1, 1, 0, 1, 1))

df2 <- data.frame(ID = c("FK5 4", "FK2 9", "KA7 3", "ML1 2", "KA4 8", "ML1 5"),
                  cat = c(6,6,4,5,4,5))

创建于2023年3月16日,使用reprex v2.0.2

yqyhoc1h

yqyhoc1h2#

我们可以在这里使用模糊连接

library(fuzzyjoin)
regex_left_join(df, df2, by = 'ID')
  • 输出
ID.x var1 var2  ID.y cat
1 FK5 4JU    a    1 FK5 4   6
2 FK2 9LD    b    1 FK2 9   6
3 KA7 3XB    c    1 KA7 3   4
4 ML1 2ND    c    0 ML1 2   5
5 KA4 8DB    d    1 KA4 8   4
6 ML1 5DD    e    1 ML1 5   5

相关问题