我有一个属于dataset mammalsleep的名称列表,我希望替换名称上有其他字符的名称。
例如:
pr_replace <- paste(c('log(brain)','I(body^2)'), collapse="|")
extract_replace <- paste(c('brain','body'), collapse="|")我们用extract_replace代替pr_replace。
我尝试过两种方法:
lapply(per, function(dat)
sapply(dat, function(x)
str_replace(x, extract_replace, pr_replace)) %>% data.frame())的值将被替换为
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我也尝试过:
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)。
预期产出:
[[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,这在尝试以下操作时失败:
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)))可复制代码(更新):
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"))发布于 2022-06-06 16:37:06
我们可以创建两个paste或一个命名向量,而不是replacement中的元素(与pattern for |中的计算值进行字面上的处理),在这里,名称应该与原始数据中的子字符串匹配,以替换来自向量的值。
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。
library(purrr)
library(stringr)
library(dplyr)
per <- map(per, ~ .x %>%
mutate(across(everything(), ~ str_replace_all(.x,
named_vec))))-output
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包装,以及有元字符(())和部分匹配。
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"https://stackoverflow.com/questions/72520564
复制相似问题