![](/img/trans.png)
[英]R Dplyr: How to replace items in a vector matching items in a list, conditionally
[英]R - Replace items in a list based on another vector
我正在进行模糊名称匹配练习,并尝试使用 tidystringdist 减少同名拼写变体的数量。 我最终得到包含两个向量的匹配项 dataframe。 一个具有原始值,第二个具有需要更改为的值。 因此,我需要将 go 返回到名称的原始向量,并根据具有匹配值的 df 更改它们。 正常这很容易,在原始名称上使用 left_join() 并完成。 但是,我的原始名称中可以包含 1 到 4 个值(属性的多个所有者),因此要更改的值实际上是一个列表列表。 这是我到目前为止所做的工作的代表:
library(dplyr)
data_to_change <- data.frame(house_number = c(1,2,3),
animal = rbind(c("dog|cat|monkey"),
c("goldfish"),
c("mouse|dog|rabbit|squirrel"))) %>%
mutate(animal_split = strsplit(animal, "[|]"))
new_names <- data.frame(cbind(V1 = c("dog", "rabbit"),
V2 = c("doggy", "bunny")))
原始数据如下所示:
[[1]]
[1] "dog" "cat" "monkey"
[[2]]
[1] "goldfish"
[[3]]
[1] "mouse" "dog" "rabbit" "squirrel"
我想更改动物名称,因此结果如下所示:
[[1]]
[1] "doggy" "cat" "monkey"
[[2]]
[1] "goldfish"
[[3]]
[1] "mouse" "doggy" "bunny" "squirrel"
我不相信我可以简单地使用替换,因为目标和匹配 df 列表的长度不同。 而且我不认为我可以取消列出并更改它,因为我需要保留与门牌号和房子里其他动物的关联。
您可以使用lapply()
环绕您的列表,并使用stringi::stri_replace_all_fixed()
替换文本。
library(stringi)
data_to_change$animal_split <- lapply(data_to_change$animal_split, stri_replace_all_fixed, new_names$V1, new_names$V2, vectorize = F)
data_to_change$animal_split
[[1]]
[1] "doggy" "cat" "monkey"
[[2]]
[1] "goldfish"
[[3]]
[1] "mouse" "doggy" "bunny" "squirrel"
由于这些是固定匹配,我们可以使用deframe
将 data.frame 转换为命名向量,然后通过循环( map
)使用它来匹配和替换list
中的向量元素,最后与原始向量coalesce
,以便NA 被原始向量替换
library(dplyr)
library(tibble)
library(purrr)
data_to_change %>%
mutate(animal_split = map(animal_split,
~ coalesce(deframe(new_names)[.x], .x)))
-输出
house_number animal animal_split
1 1 dog|cat|monkey doggy, cat, monkey
2 2 goldfish goldfish
3 3 mouse|dog|rabbit|squirrel mouse, doggy, bunny, squirrel
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.