2013-04-25 5 views
6

Ich wünsche die Klasse der ausgewählten Variablen in einer Datentabelle zu ändern, einen vektorisiert Betrieb verwenden. Ich bin neu in der Data.table-Syntax und versuche so viel wie möglich zu lernen. Ich bin jetzt die Frage ist grundlegend, aber es wird mir helfen, die Datentabelle Denkweise besser zu verstehen!Reclassify wählen Spalten in Datentabelle

Eine ähnliche Frage wurde gestellt here! Die Lösung scheint jedoch darin zu bestehen, entweder nur eine Spalte oder alle Spalten umzuordnen. Meine Frage ist einzigartig für einige ausgewählte Spalten.

### Load package 
require(data.table) 

### Create pseudo data 
data <- data.table(id  = 1:10, 
        height = rnorm(10, mean = 182, sd = 20), 
        weight = rnorm(10, mean = 160, sd = 10), 
        color = rep(c('blue', 'gold'), times = 5)) 

### Reclass all columns 
data <- data[, lapply(.SD, as.character)] 

### Search for columns to be reclassed 
index <- grep('(id)|(height)|(weight)', names(data)) 

### data frame method 
df <- data.frame(data) 
df[, index] <- lapply(df[, index], as.numeric) 

### Failed attempt to reclass columns used the data.table method 
data <- data[, lapply(index, as.character), with = F] 

Jede Hilfe wäre willkommen. Meine Daten sind groß und deshalb ist es notwendig, reguläre Ausdrücke zu verwenden, um einen Vektor von Spaltennummern zu erstellen, die neu klassifiziert werden müssen.

Vielen Dank für Ihre Zeit.

Antwort

8

Ich denke, dass @ SimonO101 hat den größten Teil der Arbeit

data[, names(data)[index] := lapply(.SD, as.character) , .SDcols = index ] 

Sie können nur die Verwendung := Magie

+0

+1 das wars !! Ok, da meine Antwort falsch ist, werde ich sie löschen. –

+0

Nein nicht tun, habe ich gelernt, dass Trick ('.SDCols') mit Ihnen so ... – dickoa

+2

(+1) direkt' passieren kann index' auch. 'Data [, C (Index): = lapply (.SD, as.character), .SDcols = index]' – Arun

4

Sie müssen nur .SDcols mit Ihrem Indexvektor verwenden (ich erfuhr das heute!), Aber das wird nur eine Datentabelle mit den reclassed Spalten zurückgeben. @dickoa's Antwort ist was du suchst.

data <- data[, lapply(.SD, as.character) , .SDcols = index ] 
sapply(data , class) 
     id  height  weight 
"character" "character" "character" 
+0

Dies erstellt ein neue Datentabelle mit nur den Spalten "index" Wie kann ich die Klasse der "Index" -Spalten ändern und den Rest der data.table im Takt halten? Ich kann leicht sehen, wie man das mit einem Merge oder Cbind macht, aber es muss einen eleganteren Weg geben! – Andreas

+0

Argggh. Du hast recht. Ich weiß das, aber ich habe auch Probleme mit der Syntax. Es gibt einen einfachen Weg - versuchen, sich an die richtige Syntax zu erinnern !! –

+0

Dies ist wichtig zu beachten. Danke, dass du deine Antwort editiert hast, um zu reflektieren, was wir gelernt haben! – Andreas

9

Sie könnten den Aufwand für den Bau von .SD innerhalb j unter Verwendung set vermeiden

for(j in index) set(data, j =j ,value = as.character(data[[j]])) 
+2

(+1) Dies ist schnell/effizient auf 2 Konten: 1) Nr. SD und 2) mit 'set' anstelle von': = '(letztere hat die' .Data.table' Overhead). Brillant! – Arun

+2

@Arun, es wird sogar auf data.frames arbeiten! – mnel

Verwandte Themen