2012-04-03 2 views
1

Ich verstehe die Antwort in R auf sich wiederholende Dinge ist in der Regel "apply()" eher als Schleife. Gibt es ein besseres R-Design-Muster für einen fiesen Code, den ich häufig erstelle?Ändern Sie Spalten in einem Datenrahmen in R sauberer - vielleicht mit() oder apply()?

Also, Tabellendaten aus HTML ziehen, muss ich normalerweise den Datentyp ändern, und am Ende läuft so etwas, um die erste Spalte in Datumsformat (von Dezimal) und Spalten 2-4 von Zeichenketten zu konvertieren mit Komma tausend Trennzeichen wie "2,400,000" zu numerischen "2400000".

X[,1] <- decYY2YY(as.numeric(X[,1])) 
X[,2] <- as.numeric(gsub(",", "", X[,2])) 
X[,3] <- as.numeric(gsub(",", "", X[,3])) 
X[,4] <- as.numeric(gsub(",", "", X[,4])) 

Ich mag es nicht, dass ich X [Anzahl] hier sowohl auf die linke und die Fahrt Seiten wiederholt, oder dass ich im Grunde die gleiche Aussage haben für 2-4 wiederholt.

Gibt es eine sehr R-ähnliche Art, X [, 2] weniger repetitiv, aber immer noch schleifenfrei zu machen? Etwas, das sagt "Anwenden auf Spalten 2,3,4 --- eine Funktion, die die aktuelle Spalte einer modifizierten Version zuweist?"

Ich möchte nicht eine ganze, wiederholbare Reinigungsfunktion erstellen, wirklich, nur eine schnelle anonyme Funktion, die dies mit weniger Wiederholungen tut.

Antwort

3

Unter der Annahme, X ein Datenrahmen ist, würde ich tun:

X[2:4] <- lapply(X[2:4], function (x) as.numeric(gsub(",", "", x))) 
+0

Das ist genau, was ich im Sinn hatte --- ich denke nicht, obwohl Sie einen Weg, auch zu beseitigen wissen Wenn Sie X [2: 4] als Zuweisung auf beiden Seiten verwenden möchten, tun Sie das? – Mittenchops

+0

Wenn Sie die Transformation auf jede Spalte anwenden möchten, könnten Sie X [] <- lapply (X, Funktion (x) as.numeric (gsub (",", "", x))) –

2

So etwas wie

comma2numeric <- function(x) { as.numeric(gsub(",","",x)) } 
X[,2:4] <- apply(X[,2:4],2,comma2numeric) 

ist ein Anfang. transform ist ein gutes Modify-in-Place-Idiom, aber es arbeitet mit Namen statt mit Spaltennummern.

bearbeitet: close-Klammer in Zeile fehlt 1

+0

Gibt es einen Trick Funktionen in einer einzigen Zeile zu definieren? Wenn ich 'comma2numeric Mittenchops

+0

Mittenchops. liner Du gibst die {} aus, zB comma2numeric <- function (x) as.numerisch (gsub (",", "", x) –

+0

Ich habe die '{}' (obwohl unnötig) eingefügt, weil ich denke, dass sie ein wenig von Präzision (Codierungsstile und Geschmäcker sind verschieden). Die fehlende enge Klammer war das eigentliche Problem. –

Verwandte Themen