複数のパターンが一致した後、データテーブル列の複数の値を置き換えます

Nov 22 2020

これは私のようないくつかの「R初心者」を助けることができるスニペットです:私は私の溶けたデータテーブルの必要性のためにこのスレッドを参照していました:

dplyrとの部分一致に基づいて、データフレーム内の任意の場所で文字列全体を置き換えます

データテーブルの列の1つにある文字列全体を部分一致文字列に置き換える簡単な方法を探していました。私はフォーラムにぴったり合うものを見つけることができなかったので、この投稿。

dt<-data.table(x=c("A_1", "BB_2", "CC_3"),y=c("K_1", "LL_2", "MM_3"),z=c("P_1","QQ_2","RR_3")
> dt
      x    y    z
1:  A_1  K_1  P_1
2: BB_2 LL_2 QQ_2
3: CC_3 MM_3 RR_3

col内の複数の値を、y一致する複数のパターンに置き換えます。

dt[,2]<-str_replace_all(as.matrix(dt[,2]),c("K_.*" = "FORMULA","LL_.*" = "RACE","MM_.*" = "CAR"))

as.matrix()on列を使用すると、str_replace_all()関数への入力時の警告が除外されます。結果は次のとおりです。

> dt[,2]<-str_replace_all(as.matrix(dt[,2]),c("K_.*" = "FORMULA","LL_.*" = "RACE","MM_.*" = "CAR"))
> dt
      x       y    z
1:  A_1 FORMULA  P_1
2: BB_2    RACE QQ_2
3: CC_3     CAR RR_3
>

非常にエレガントではありませんが、私にとってはうまくいきました。列データが大きい場合、これは迅速な解決策のように思われました。

が必要library(stringr)です。改善するための提案をいただければ幸いです。

私が以下のようなことを試みたので、この投稿を編集します:

dt<-data.table(x=c("A_1", "BB_2", "CC_3"),y=c("K_1", "LL_2", "MM_3"),z=c("P_1","QQ_2","RR_3"))            
dt[, nu_col := c(1:3)]
molten.dt<-melt(dt,id.vars = "nu_col", measure.vars = c("x","y","z"))
molten.dt[, one_more := ifelse(grepl("A_.*", value), "HONDA","FERRARI")]

Rstudioのコンソールに表示されるエラーは次のとおりです。

Error in `:=`(one_more, ifelse(grepl("A_.*", value), "HONDA", "FERRARI")) : 
  Check that is.data.table(DT) == TRUE. Otherwise, := and `:=`(...) are defined for use in j, once only and in particular ways. See help(":=").

Rターミナルで完全に正常に動作します

> dt<-data.table(x=c("A_1", "BB_2", "CC_3"),y=c("K_1", "LL_2", "MM_3"),z=c("P_$
> dt[, nu_col := c(1:3)]
> molten.dt<-melt(dt,id.vars = "nu_col", measure.vars = c("x","y","z"))
> molten.dt
   nu_col variable value
1:      1        x   A_1
2:      2        x  BB_2
3:      3        x  CC_3
4:      1        y   K_1
5:      2        y  LL_2
6:      3        y  MM_3
7:      1        z   P_1
8:      2        z  QQ_2
9:      3        z  RR_3
> molten.dt[, one_more := ifelse(grepl("A_.*", value), "HONDA","FERRARI")]
> molten.dt
   nu_col variable value one_more
1:      1        x   A_1    HONDA
2:      2        x  BB_2  FERRARI
3:      3        x  CC_3  FERRARI
4:      1        y   K_1  FERRARI
5:      2        y  LL_2  FERRARI
6:      3        y  MM_3  FERRARI
7:      1        z   P_1  FERRARI
8:      2        z  QQ_2  FERRARI
9:      3        z  RR_3  FERRARI
>

回答

1 Cole Nov 23 2020 at 01:06

data.tableには、適切に更新するための異なるAPIがあります。これはdplyrになりますが:

tib <- tib %>% mutate(new_col = old_col + 2)

:=演算子を使用して同じことが行われます。

dt[, new_col := old_col + 2]

したがって、角かっこ内に入ると、ベクトルを他の関数に渡すことができることに注意してください。あなたの例にそれを適用するために、私たちはすることができます...

library(data.table)
library(stringr)
dt<-data.table(x=c("A_1", "BB_2", "CC_3"),y=c("K_1", "LL_2", "MM_3"),z=c("P_1","QQ_2","RR_3"))            

dt[, y := str_replace_all(y,c("K_.*" = "FORMULA","LL_.*" = "RACE","MM_.*" = "CAR")) ]               

dt

##         x       y      z
##    <char>  <char> <char>
## 1:    A_1 FORMULA    P_1
## 2:   BB_2    RACE   QQ_2
## 3:   CC_3     CAR   RR_3

以来、注意、str_replace_allベクトルを期待し、あなたが交換している可能性がas.matrix(dt[,2])dt[[2]]。違いはdt[, 2]、単一列のdata.tableを生成することです。as.matrix(dt[, 2])単一の列行列をdt[[2]]生成しますが、ベクトルを生成します。それでもdt[, new := old + 2]、構文のタイプを使用することをお勧めします。