str_replace_all 按位置,应用于矢量
str_replace_all by position, applied over a vector
我有一个数据框,其中每个条目都是一些字符串,用逗号分隔。我想要一种按位置替换每个元素的简洁方法。
这是数据的玩具版本
library(tidyverse)
d1 <- tibble(
r1 = c("lab1",
"lab2,lab3",
NA,
"lab3,lab4"),
r2 = c(NA,
"lab1",
"lab2",
"lab2,lab3")
)
所以我想用相应的 rep
元素替换每个 lab
元素。
d1 %>%
modify_at(1:2,
~ str_replace_all(.,
c("lab1", "lab2", "lab3", "lab4"),
c("rep1", "rep2", "rep3", "rep4")))
Returns
# A tibble: 4 x 2
r1 r2
<chr> <chr>
1 rep1 <NA>
2 rep2,lab3 lab1
3 <NA> lab2
4 lab3,rep4 lab2,lab3
所以我只对 r1
中的每个单元格进行了一次替换,而我需要将它们全部替换。
您可以使用 qdap
包中的 multigsub
:
library(qdap)
d1 %>%
modify_at(1:2,
~ multigsub(c("lab1", "lab2", "lab3", "lab4"),
c("rep1", "rep2", "rep3", "rep4"),
.))
r1 r2
1 rep1 <NA>
2 rep2,rep3 rep1
3 <NA> rep2
4 rep3,rep4 rep2,rep3
如果您的实际用例只需要将 lab
替换为 rep
,而不管后面的数字是多少,您也可以这样做:
map_df(d1, ~ gsub("lab", "rep", .x))
这应该有效
d1 %>%
modify_at(1:2,
~ stringr::str_replace_all(.,
c("lab1" = "rep1",
"lab2" = "rep2",
"lab3" = "rep3",
"lab4" = "rep4")))
要在字符串的每个元素中执行多个替换,将命名向量(c(模式 1 = 替换 1))传递给 str_replace_all
使用 stringi
-包:
library(stringi)
patt <- c("lab1", "lab2", "lab3", "lab4")
repl <- c("rep1", "rep2", "rep3", "rep4")
d1[] <- lapply(d1, stri_replace_all_fixed, patt, repl, vectorize_all = FALSE)
结果:
> d1
r1 r2
1 rep1 <NA>
2 rep2,rep3 rep1
3 <NA> rep2
4 rep3,rep4 rep2,rep3
我有一个数据框,其中每个条目都是一些字符串,用逗号分隔。我想要一种按位置替换每个元素的简洁方法。
这是数据的玩具版本
library(tidyverse)
d1 <- tibble(
r1 = c("lab1",
"lab2,lab3",
NA,
"lab3,lab4"),
r2 = c(NA,
"lab1",
"lab2",
"lab2,lab3")
)
所以我想用相应的 rep
元素替换每个 lab
元素。
d1 %>%
modify_at(1:2,
~ str_replace_all(.,
c("lab1", "lab2", "lab3", "lab4"),
c("rep1", "rep2", "rep3", "rep4")))
Returns
# A tibble: 4 x 2
r1 r2
<chr> <chr>
1 rep1 <NA>
2 rep2,lab3 lab1
3 <NA> lab2
4 lab3,rep4 lab2,lab3
所以我只对 r1
中的每个单元格进行了一次替换,而我需要将它们全部替换。
您可以使用 qdap
包中的 multigsub
:
library(qdap)
d1 %>%
modify_at(1:2,
~ multigsub(c("lab1", "lab2", "lab3", "lab4"),
c("rep1", "rep2", "rep3", "rep4"),
.))
r1 r2 1 rep1 <NA> 2 rep2,rep3 rep1 3 <NA> rep2 4 rep3,rep4 rep2,rep3
如果您的实际用例只需要将 lab
替换为 rep
,而不管后面的数字是多少,您也可以这样做:
map_df(d1, ~ gsub("lab", "rep", .x))
这应该有效
d1 %>%
modify_at(1:2,
~ stringr::str_replace_all(.,
c("lab1" = "rep1",
"lab2" = "rep2",
"lab3" = "rep3",
"lab4" = "rep4")))
要在字符串的每个元素中执行多个替换,将命名向量(c(模式 1 = 替换 1))传递给 str_replace_all
使用 stringi
-包:
library(stringi)
patt <- c("lab1", "lab2", "lab3", "lab4")
repl <- c("rep1", "rep2", "rep3", "rep4")
d1[] <- lapply(d1, stri_replace_all_fixed, patt, repl, vectorize_all = FALSE)
结果:
> d1
r1 r2
1 rep1 <NA>
2 rep2,rep3 rep1
3 <NA> rep2
4 rep3,rep4 rep2,rep3