Ersetzen Sie mehrere Werte in der Datentabellenspalte nach mehreren Musterübereinstimmungen

Nov 22 2020

Hier ist ein Ausschnitt, der einigen 'R-Anfängern' wie mir helfen könnte: Ich habe mich auf diesen Thread bezogen, um einen Bedarf in meiner geschmolzenen Datentabelle zu haben:

Ersetzen Sie die gesamte Zeichenfolge an einer beliebigen Stelle im Datenrahmen, basierend auf der teilweisen Übereinstimmung mit dplyr

Ich suchte nach einer einfachen Möglichkeit, eine ganze Zeichenfolge in einer der Spalten in der Datentabelle durch eine teilweise Übereinstimmungszeichenfolge zu ersetzen. Ich konnte keine direkte Passform im Forum finden, daher dieser Beitrag.

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

Ersetzen Sie mehrere Werte in Spalte ydurch mehrere übereinstimmende Muster:

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

Die Verwendung der as.matrix()Spalte on schließt die Warnung bei der Eingabe in die str_replace_all()Funktion aus. Das Ergebnis ist:

> 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
>

sehr unelegant, aber für mich funktioniert, wenn die Spaltendaten groß sind, schien dies eine schnelle Lösung zu sein.

Benötigt library(stringr). Verbesserungsvorschläge sind willkommen.

Bearbeiten dieses Beitrags, als ich etwas wie das Folgende versuchte:

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")]

Der Fehler, den ich auf der Rstudio-Konsole sehe, ist:

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(":=").

Läuft einwandfrei auf dem R-Terminal

> 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
>

Antworten

1 Cole Nov 23 2020 at 01:06

data.table verfügt über eine andere API für die Aktualisierung. Während dies dplyr wäre :

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

Das Gleiche geschieht mit dem :=Operator:

dt[, new_col := old_col + 2]

Beachten Sie also, dass wir, sobald wir uns in den Klammern befinden, einen Vektor an andere Funktionen weitergeben können. Um dies auf Ihr Beispiel anzuwenden, können wir ...

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

Beachten Sie , da str_replace_allein Vektor erwartet, könnten Sie haben ersetzt as.matrix(dt[,2])mit dt[[2]]. Der Unterschied besteht darin, dass dt[, 2]eine einspaltige Datentabelle erstellt wird. as.matrix(dt[, 2])erzeugt eine einzelne Spaltenmatrix, während dt[[2]]ein Vektor erzeugt wird. Ich würde immer noch empfehlen, die dt[, new := old + 2]Art der Syntax zu verwenden.