繁体   English   中英

R - 根据另一个向量替换列表中的项目

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM