2014-07-05 37 views
23

Ich versuche, eine Reihe von data.tables auf ähnliche Weise zu bearbeiten, und möchte eine Funktion schreiben, um dies zu erreichen. Ich möchte einen Parameter übergeben, der eine Liste von Spalten enthält, in denen die Operationen ausgeführt werden. Dies funktioniert gut, wenn die Vektordeklaration von Spalten die linke Seite des: = -Operators ist, aber nicht, wenn sie früher deklariert (oder an die Funktion übergeben) wird. Der folgende Code zeigt das Problem.Entfernen mehrerer Spalten aus R data.table mit Parameter für zu entfernende Spalten

dt = data.table(a = letters, b = 1:2, c=1:13) 
colsToDelete = c('b', 'c') 
dt[,colsToDelete := NULL] # doesn't work but I don't understand why not. 
dt[,c('b', 'c') := NULL] # works fine, but doesn't allow passing in of columns 

Der Fehler wird als "neue Spalte 'colsToDelete' dann NULL Zuweisen Hinzufügen (ihn zu löschen)." So interpretiert es eindeutig 'colsToDelete' als neuen Spaltennamen.

Das gleiche Problem tritt auf, wenn etwas in diese Richtung

dt[, colNames := lapply(.SD, adjustValue, y=factor), .SDcols = colNames] 

I R neu zu tun, sondern mehr Erfahrung mit einigen anderen Sprachen, so kann dies eine dumme Frage sein.

Antwort

33

Es ist im Grunde, weil wir Symbole auf LHS von := erlauben, neue Spalten hinzuzufügen, für die Bequemlichkeit: ex: DT[, col := val]. Um zu unterscheiden, ob col selbst der Name von dem ist, was in col als Spaltennamen gespeichert ist, überprüfen wir, ob es sich bei der LHS um eine name oder eine expression handelt.

Wenn es eine name ist, fügt es die Spalte mit dem Namen als solche auf der LHS, und wenn expression, dann wird es ausgewertet.

DT[, col := val] # col is the column name. 

DT[, (col) := val] # col gets evaluated and replaced with its value 
DT[, c(col) := val] # same as above 

Die bevorzugte Idiom ist: dt[, (colsToDelete) := NULL]

HTH

3

auf vorherige Antwort zu erweitern, können Sie Spalten durch Verweis löschen tun:

# delete columns 10 to 15 
dt[ , (10:15) := NULL ] 

oder

# delete columns 3, 5 and 10 to 15 
dt[ , (c(3,5,10:15)) := NULL ] 
Verwandte Themen