Ich habe ein Problem bei der Verwendung von data.table: Wie konvertiere ich Spaltenklassen? Hier ein einfaches Beispiel: Mit data.frame habe ich kein Problem beim Konvertieren, mit data.table weiß ich einfach nicht wie:
df <- data.frame(ID=c(rep("A", 5), rep("B",5)), Quarter=c(1:5, 1:5), value=rnorm(10))
#One way: http://stackoverflow.com/questions/2851015/r-convert-data-frame-columns-from-factors-to-characters
df <- data.frame(lapply(df, as.character), stringsAsFactors=FALSE)
#Another way
df[, "value"] <- as.numeric(df[, "value"])
library(data.table)
dt <- data.table(ID=c(rep("A", 5), rep("B",5)), Quarter=c(1:5, 1:5), value=rnorm(10))
dt <- data.table(lapply(dt, as.character), stringsAsFactors=FALSE)
#Error in rep("", ncol(xi)) : invalid 'times' argument
#Produces error, does data.table not have the option stringsAsFactors?
dt[, "ID", with=FALSE] <- as.character(dt[, "ID", with=FALSE])
#Produces error: Error in `[<-.data.table`(`*tmp*`, , "ID", with = FALSE, value = "c(1, 1, 1, 1, 1, 2, 2, 2, 2, 2)") :
#unused argument(s) (with = FALSE)
Vermisse ich hier etwas Offensichtliches?
Update aufgrund von Matthews Beitrag: Ich habe zuvor eine ältere Version verwendet, aber auch nach dem Update auf 1.6.6 (die Version, die ich jetzt verwende) wird immer noch eine Fehlermeldung angezeigt.
Update 2: Angenommen, ich möchte jede Spalte der Klasse "Faktor" in eine Spalte "Zeichen" konvertieren, weiß aber nicht im Voraus, welche Spalte zu welcher Klasse gehört. Mit einem data.frame kann ich Folgendes tun:
classes <- as.character(sapply(df, class))
colClasses <- which(classes=="factor")
df[, colClasses] <- sapply(df[, colClasses], as.character)
Kann ich mit data.table etwas Ähnliches machen?
Update 3:
sessionInfo () R Version 2.13.1 (08.07.2011) Plattform: x86_64-pc-mingw32 / x64 (64-Bit)
locale:
[1] C
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] data.table_1.6.6
loaded via a namespace (and not attached):
[1] tools_2.13.1
quelle
data.table
Methoden unterscheiden sich von denen fürdata.frame
#Produces error
. +1 sowieso. Ich bekomme keine Fehlermeldung, welche Version hast du? Es gibt jedoch ein Problem in diesem Bereich, das bereits erwähnt wurde. FR # 1224 und FR # 1493 haben eine hohe Priorität. Andries Antwort ist jedoch der beste Weg.invalid times argument
Fehler sicher ? Arbeite gut für mich. Welche Version hast du?Antworten:
Für eine einzelne Spalte:
Verwenden von
lapply
undas.character
:quelle
convcols
für Spalten definiert.dt[,lapply(.SD,as.numeric),.SDcols=convcols]
ist fast augenblicklich, währenddt[,convcols:=lapply(.SD,as.numeric),.SDcols=convcols]
R fast einfriert, also schätze ich, dass ich es falsch mache. Dankeset()
zBfor (col in names_factors) set(dt, j=col, value=as.factor(dt[[col]]))
[Zitat beenden] zu verwendenVersuche dies
quelle
Filter
die Spalten mithilfe der Funktion identifizieren, zum Beispiel:changeCols<- names(Filter(is.character, DT))
changeCols <- names(DT)[sapply(DT, is.character)]
.Wenn Sie den Kommentar von Matt Dowle zu Geneoramas Antwort ( https://stackoverflow.com/a/20808945/4241780 ) ansprechen , um ihn offensichtlicher zu machen (wie empfohlen ), können Sie ihn verwenden
for(...)set(...)
.Erstellt am 12.02.2020 durch das reprex-Paket (v0.3.0)
Weitere Informationen finden Sie in einem weiteren Kommentar von Matt unter https://stackoverflow.com/a/33000778/4241780 .
Bearbeiten.
Wie von Espen und in angegeben
help(set)
,j
kann dies "Spaltenname (n) (Zeichen) oder Nummer (n) (Ganzzahl) sein, denen ein Wert zugewiesen werden soll, wenn Spalte (n) bereits vorhanden sind". Sonames_factors <- c(1L, 3L)
wird es auch funktionieren.quelle
names_factors
hier ist. Ich denke, es stammt von stackoverflow.com/a/20808945/1666063, alsonames_factors = c('fac1', 'fac2')
in diesem Fall - das sind Spaltennamen. Aber es könnten auch Spaltennummern sein, zum Beispiel 1; ncol (dt), die alle Spalten konvertieren würdenDies ist ein schlechter Weg, um es zu tun! Ich lasse diese Antwort nur für den Fall, dass sie andere seltsame Probleme löst. Diese besseren Methoden sind wahrscheinlich teilweise das Ergebnis neuerer data.table-Versionen. Es lohnt sich also, diesen harten Weg zu dokumentieren. Außerdem ist dies ein schönes Syntaxbeispiel für die
eval
substitute
Syntax.was gibt dir
quelle
set()
zBfor (col in names_factors) set(dt, j=col, value=as.factor(dt[[col]]))
set
angemessener ist.for(...)set(...)
hier: stackoverflow.com/a/33000778/403310Ich habe verschiedene Ansätze ausprobiert.
, oder andernfalls
quelle
Ich biete eine allgemeinere und sicherere Möglichkeit, dieses Zeug zu machen,
Die Funktion
..
stellt sicher, dass wir eine Variable aus dem Bereich von data.table herausholen. set_colclass legt die Klassen Ihrer Spalten fest. Sie können es so verwenden:quelle
Wenn Sie eine Liste mit Spaltennamen in data.table haben, möchten Sie die Klasse do ändern:
quelle
dt[, c(convert_to_character) := lapply(.SD, as.character), .SDcols=convert_to_character]
Führen Sie dies einfach durch Referenz zu, anstatt die langsamere Zuweisung von data.frame zu verwenden.Versuchen:
quelle