首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >替换在列表上部分匹配的单词

替换在列表上部分匹配的单词
EN

Stack Overflow用户
提问于 2022-06-06 16:16:39
回答 1查看 44关注 0票数 1

我有一个属于dataset mammalsleep的名称列表,我希望替换名称上有其他字符的名称。

例如:

代码语言:javascript
复制
pr_replace <- paste(c('log(brain)','I(body^2)'), collapse="|")
extract_replace <- paste(c('brain','body'), collapse="|")

我们用extract_replace代替pr_replace

我尝试过两种方法:

代码语言:javascript
复制
  lapply(per, function(dat)
    sapply(dat, function(x)
      str_replace(x, extract_replace, pr_replace)) %>% data.frame())

的值将被替换为

代码语言:javascript
复制
                X9
1             exposure               danger log(brain)|I(body^2)
2               danger log(brain)|I(body^2) log(brain)|I(body^2)
3 log(brain)|I(body^2) log(brain)|I(body^2)             nondream
4 log(brain)|I(body^2)             nondream                dream
5             nondream                dream                sleep
6                dream                sleep            gestation
7                sleep            gestation            predation
8            gestation            predation             exposure
9            predation             exposure               danger

我也尝试过:

代码语言:javascript
复制
pr_r<-c('log(brain)','I(body^2)')
  mapply(function(x, y)
    lapply(x, function(dat)
      sapply(dat, function(z)
        str_replace(z, extract_replace, y)) %>% data.frame()), per, pr_r, SIMPLIFY = FALSE)

然而,这并没有产生我想要的结果。

预期输出:当找到值brain时,我们应该得到log(brain),当body被找到时,我们应该替换I(body^2)

预期产出:

代码语言:javascript
复制
[[1]]
         X1        X2        X3        X4        X5        X6       X7       X8       X9
1     log(brain)  nondream     dream     sleep gestation predation exposure   danger     I(body^2)
2  nondream     dream     sleep gestation predation  exposure   danger     I(body^2)    log(brain)
3     dream     sleep gestation predation  exposure    danger     body    log(brain) nondream
4     sleep gestation predation  exposure    danger      I(body^2)    log(brain) nondream    dream
5 gestation predation  exposure    danger      I(body^2)     brain nondream    dream    sleep

[[2]]
         X1        X2        X3        X4        X5        X6       X7       X8        X9
1     log(brain)  nondream     dream     sleep gestation predation exposure   danger      I(body^2)
2  nondream     dream     sleep gestation predation  exposure   danger     I(body^2)     log(brain)
3     dream     sleep gestation predation  exposure    danger     body    log(brain)  nondream
4     sleep gestation predation  exposure    danger      I(body^2)    brain nondream     dream
5 gestation predation  exposure    danger      I(body^2)     log(brain) nondream    dream     sleep
6 predation  exposure    danger      I(body^2)     brain  nondream    dream    sleep gestation

更新:当试图在向量上使用它时,例如数据集的名称。例如,我希望log(X1)更改为X1,这在尝试以下操作时失败:

代码语言:javascript
复制
pr_replace <- c('log(X1)', 'log(X8)')
extract_replace <- c('X1', 'X8')
lapply(per, names) %>% map(., ~ .x %>% str_replace_all(.x, setNames(extract_replace, pr_replace)))

可复制代码(更新):

代码语言:javascript
复制
per <- list(structure(list(`log(X1)` = c("brain", "nondream", "dream", 
"sleep", "gestation"), X2 = c("nondream", "dream", "sleep", "gestation", 
"predation"), X3 = c("dream", "sleep", "gestation", "predation", 
"exposure"), X4 = c("sleep", "gestation", "predation", "exposure", 
"danger"), X5 = c("gestation", "predation", "exposure", "danger", 
"body"), X6 = c("predation", "exposure", "danger", "body", "brain"
), X7 = c("exposure", "danger", "body", "brain", "nondream"), 
    `log(X8)` = c("danger", "body", "brain", "nondream", "dream"
    ), X9 = c("body", "brain", "nondream", "dream", "sleep")), row.names = c(NA, 
5L), class = "data.frame"), structure(list(`log(X1)` = c("brain", 
"nondream", "dream", "sleep", "gestation", "predation"), X2 = c("nondream", 
"dream", "sleep", "gestation", "predation", "exposure"), X3 = c("dream", 
"sleep", "gestation", "predation", "exposure", "danger"), X4 = c("sleep", 
"gestation", "predation", "exposure", "danger", "body"), X5 = c("gestation", 
"predation", "exposure", "danger", "body", "brain"), X6 = c("predation", 
"exposure", "danger", "body", "brain", "nondream"), X7 = c("exposure", 
"danger", "body", "brain", "nondream", "dream"), `log(X8)` = c("danger", 
"body", "brain", "nondream", "dream", "sleep"), X9 = c("body", 
"brain", "nondream", "dream", "sleep", "gestation")), row.names = c(NA, 
6L), class = "data.frame"))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-06 16:37:06

我们可以创建两个paste或一个命名向量,而不是replacement中的元素(与pattern for |中的计算值进行字面上的处理),在这里,名称应该与原始数据中的子字符串匹配,以替换来自向量的值。

代码语言:javascript
复制
pr_replace <- c('log(brain)','I(body^2)')
extract_replace <- c('brain','body')
named_vec <- setNames(pr_replace, extract_replace)

现在,我们使用list循环map,循环across数据集的列,并使用命名向量应用str_replace

代码语言:javascript
复制
library(purrr)
library(stringr)
library(dplyr)
per <- map(per, ~ .x %>%
   mutate(across(everything(), ~ str_replace_all(.x, 
        named_vec))))

-output

代码语言:javascript
复制
per
[[1]]
          X1        X2        X3        X4        X5         X6         X7         X8         X9
1 log(brain)  nondream     dream     sleep gestation  predation   exposure     danger  I(body^2)
2   nondream     dream     sleep gestation predation   exposure     danger  I(body^2) log(brain)
3      dream     sleep gestation predation  exposure     danger  I(body^2) log(brain)   nondream
4      sleep gestation predation  exposure    danger  I(body^2) log(brain)   nondream      dream
5  gestation predation  exposure    danger I(body^2) log(brain)   nondream      dream      sleep

[[2]]
          X1        X2        X3        X4         X5         X6         X7         X8         X9
1 log(brain)  nondream     dream     sleep  gestation  predation   exposure     danger  I(body^2)
2   nondream     dream     sleep gestation  predation   exposure     danger  I(body^2) log(brain)
3      dream     sleep gestation predation   exposure     danger  I(body^2) log(brain)   nondream
4      sleep gestation predation  exposure     danger  I(body^2) log(brain)   nondream      dream
5  gestation predation  exposure    danger  I(body^2) log(brain)   nondream      dream      sleep
6  predation  exposure    danger I(body^2) log(brain)   nondream      dream      sleep  gestation

对于具有列名的更新大小写,请使用fixed包装,以及有元字符(())和部分匹配。

代码语言:javascript
复制
map(per, ~ str_replace_all(names(.x), 
       fixed(setNames(extract_replace, pr_replace))))
[[1]]
[1] "X1" "X2" "X3" "X4" "X5" "X6" "X7" "X8" "X9"

[[2]]
[1] "X1" "X2" "X3" "X4" "X5" "X6" "X7" "X8" "X9"
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72520564

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档