在R中,我如何使用第三列上的模糊匹配将 Dataframe 的一列中的字符串值替换为另一个 Dataframe 中的字符串值?

oalqel3c  于 2023-06-19  发布在  其他
关注(0)|答案(1)|浏览(119)

我的谷歌一定是失败了,因为我觉得有人必须有这个问题之前,我找不到一个解决方案。
假设我有以下数据:

df1 <- data.frame(Name = c("Banana", "Apple", "Sponge", "Donut", "Bleach", "Wine"),
                 Value = c("Fruit", "Fruit", "Cleaner", "Dessert", "Cleaner", "Party"))

df2 <- data.frame(Name = c("Ban", "Ap", "Do", "Wi"),
                  Value = c("F", "F", "D", "P"))

我需要能够在df1$Name和df2$Name上进行模糊字符串匹配,并且在它们匹配的地方将df1$Value替换为df2$Value,其中$Name模糊匹配。如果没有匹配,我想保留df 1的值。这样,我的输出看起来像这样:
| 姓名|价值|
| - -----|- -----|
| 香蕉|F型|
| 苹果|F型|
| 海绵|清洁剂|
| 甜甜圈|D级|
| 漂白剂|清洁剂|
| 葡萄酒|压力|
我希望任何以“Ban”开头的都是F我不在乎它是否说香蕉金或任何在df2$Name之后。df 1中的行数是几千行,df 2只有67行。
此外,df 1还有一些不相关的附加列,但我想保留下来。
我找到的最接近我想要的代码是这样的:

df3 <- df1 %>% mutate(across(c(Name), ~if_else(str_detect(Name, df2$Name), str_replace(Value .,df2$Name)))

但我得到以下错误:
mutate()中的错误:在论证中:across(...)。由str_detect()中的错误引起:!无法回收string(大小1362)以匹配pattern(大小67)。运行rlang::last_trace()查看错误发生的位置。
对于这段代码,我也得到了同样的错误:
df1$Value <- str_replace_all(df1$Value,df1$Name == df2$Name,df2$Value)
我也试过:

df1 <- df1 %>% mutate(across(everything(), ~deframe(df2[.])))

我错过了什么?我有种感觉只是我没看到的很简单。我是R的新手,非常感谢您的帮助!

sg3maiej

sg3maiej1#

df1 %>%
  mutate(Name1 = Name %>%
           str_replace_all(set_names(df2$Value, str_c(df2$Name, ".*"))),
         Value = ifelse(Name == Name1, Value, Name1),
         Name1 = NULL)

   Name   Value
1 Banana       F
2  Apple       F
3 Sponge Cleaner
4  Donut       D
5 Bleach Cleaner
6   Wine       P
fuzzyjoin::regex_left_join(df1, df2, 'Name') %>%
   reframe(Name = Name.x, Value = coalesce(Value.y, Value.x))

    Name   Value
1 Banana       F
2  Apple       F
3 Sponge Cleaner
4  Donut       D
5 Bleach Cleaner
6   Wine       P

相关问题