2017-09-08 10 views
3

私は、各エントリがコンマで区切られたいくつかの文字列であるデータフレームを持っています。私は位置ごとにすべての要素を置き換えるきちんとした方法が欲しいです。str_replace_all(位置指定、ベクトル上に適用)

ここにデータ

library(tidyverse) 

d1 <- tibble(
    r1 = c("lab1", 
     "lab2,lab3", 
     NA, 
     "lab3,lab4"), 
    r2 = c(NA, 
     "lab1", 
     "lab2", 
     "lab2,lab3") 
) 

のおもちゃのバージョンは、対応するrep要素によってreplacted私が欲しいので、すべてのlab要素です。私はそれらすべてを交換する必要があるのに対し、

d1 %>% 
    modify_at(1:2, 
     ~ str_replace_all(., 
          c("lab1", "lab2", "lab3", "lab4"), 
          c("rep1", "rep2", "rep3", "rep4"))) 

戻り

# 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にセルごとに単一の交換を行いました。

答えて

4

これは、文字列の各要素に複数の置換を行うために

d1 %>% 
     modify_at(1:2, 
       ~ stringr::str_replace_all(., 
              c("lab1" = "rep1", 
              "lab2" = "rep2", 
              "lab3" = "rep3", 
              "lab4" = "rep4"))) 

仕事stringi -packageで

3

あなたはqdapパッケージからmultigsubを使用することができます。あなたの本当のユースケースがちょうどreplabを交換する必要がある場合は関係なく、次の数の、あなたも行うことができ、

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 

map_df(d1, ~ gsub("lab", "rep", .x)) 
1

をstr_replace_allするという名前のベクトル(C(PATTERN1 = replacement1))を通過する必要があります。

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 
関連する問題