我的谷歌一定是失败了,因为我觉得有人必须有这个问题之前,我找不到一个解决方案。
假设我有以下数据:
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的新手,非常感谢您的帮助!
1条答案
按热度按时间sg3maiej1#