2017-10-31 13 views
3

私は文字列置換テーブルを持っています。私はすべての置換パターンをターゲットデータフレームに適用する必要があります。 1つのセルに複数の置換文字列を入れることができます。置換テーブルにないターゲットはNAに変換されます。遅くて醜いネストループでこれを管理しました。私はこれをより良くコード化する方法についていくつかのアイデアを使用することができます。おかげさまで 次に例を示します。base R複数のパターンを複数の置換えに置き換えます

library(tibble) 
#define replacement table 
rt <-tribble(
    ~to.replace, ~replace.with, 
    "abc"  , "xyz", 
    "def"  , "qwe", 
    "lkj"  , "dffg", 
    "cvb"  , "mnb" 
) 
#create a sample data.frame with some extra strings not in the replacement table 
set.seed(1) 
df <- data.frame(a = paste0(sample(c(rt$to.replace, "jhg", "ert", "ytr"),10,replace=T)," ; ", 
          sample(c(rt$to.replace, "jhg", "ert", "ytr"),10,replace=T)), 
       b = paste0(sample(c(rt$to.replace, "vfe", "thn", "mjh"),10,replace=T)," ; ", 
          sample(c(rt$to.replace, "vfe", "thn", "mjh"),10,replace=T))) 
> df 
      a   b 
1 def ; def mjh ; cvb 
2 lkj ; def def ; vfe 
3 jhg ; jhg vfe ; cvb 
4 ytr ; lkj abc ; def 
5 def ; ert def ; thn 
6 ytr ; cvb lkj ; vfe 
7 ytr ; ert abc ; thn 
8 jhg ; ytr lkj ; abc 
9 jhg ; lkj mjh ; thn 
10 abc ; ert lkj ; lkj 
# Here is what df is supposed to look like after applying all the replacements 
> df 
      a   b 
1 qwe ; qwe NA ; mnb 
2 dffg ; qwe qwe ; NA 
3 NA ; NA NA ; mnb 
4 NA ; dffg xyz ; qwe 
5 qwe ; NA qwe ; NA 
6 NA ; mnb dffg ; NA 
7 NA ; NA xyz ; NA 
8 NA ; NA dffg ; xyz 
9 NA ; dffg NA ; NA 
10 xyz ; NA dffg ; dffg 

答えて

2

1つのオプションはmatch、その後、各列に文字列を分割し、「RT」

df[] <- lapply(df, function(x) sapply(strsplit(as.character(x), " ; "), 
     function(y) paste(rt$replace.with[match(y, rt$to.replace)], collapse=' ; '))) 
df 
#   a   b 
#1 qwe ; qwe NA ; mnb 
#2 dffg ; qwe qwe ; NA 
#3  NA ; NA NA ; mnb 
#4 NA ; dffg xyz ; qwe 
#5 qwe ; NA qwe ; NA 
#6 NA ; mnb dffg ; NA 
#7  NA ; NA xyz ; NA 
#8  NA ; NA dffg ; xyz 
#9 NA ; dffg  NA ; NA 
#10 xyz ; NA dffg ; dffg 
から値を置き換えることであろう
関連する問題