Ersetzen Sie mehrere Werte in der Datentabellenspalte nach mehreren Musterübereinstimmungen
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 y
durch 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
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_all
ein 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.