2016-04-12 4 views
1

Ich arbeite mit einem großen Dataset, das viele Variablen enthält. Daher möchte ich vermeiden, jederzeit Spaltennamen einzugeben. Ich möchte die Spalten in meinen Daten durchlaufen und die Wert enthaltenen Felder pro Spalte extrahieren. Mit anderen Worten, ich möchte getrennte Datentabellen für jede Spalte haben, von denen keine NA-Werte enthält.R: Iterativ nicht NA-Werte für Spalten in einer Datentabelle extrahieren und in separate Spalten aufteilen, ohne Spaltennamen einzugeben

Meine Vorgehensweise besteht darin, eine Schleife zu schreiben, die zuerst die NA-Werte pro Spalte eliminiert. Ich extrahierte die Spaltennamen in einer separaten Spaltenmatrix beim Lesen der .csv-Datei (mit fread). Das Problem ist, dass ich es nicht geschafft habe, die Spaltennamen oder die NA mit meinem Ansatz auszuschließen. Ich arbeitete ein kleines Beispiel, das Problem zu veranschaulichen:

# Example data 
dt = data.table(color=c("b","g","r","y",NA), 
       size=c("S", "XL", NA, NA, "M"), 
       number=(1:5)) 
columns = matrix(c("color", "size", "number"), nrow=3, ncol=1) 

Die Schleife unten arbeitet gezeigt, obwohl es nicht wirklich eine Schleife ist, weil es erfordert immer noch die Spaltennamen in der ersten Zeile eingefügt:

# Works (but requires typing in the column name) 
for(i in 1:1){ 
    var <- dt %>% group_by(color) %>% filter(!is.na(color)) 
    name <- paste("new", columns[i], sep=".") 
    assign(name, var[, columns[i], with=FALSE])} 

# Output: 
    color 
(chr) 
1  b 
2  g 
3  r 
4  y 

Meine Idee ist es, innerhalb der Schleife auf die nachfolgenden Spalten zu verweisen, indem Sie die extrahierten Spaltennamen verwenden. Das Problem hierbei ist, dass die NA-Werte nicht ausscheiden, dh die erste Zeile des Codes innerhalb der Schleife nicht funktioniert:

# Does not work 
for(i in 1:1){ 
    var <- dt %>% group_by(columns[i]) %>% filter(!is.na(columns[i])) 
    name <- paste("new", columns[i], sep=".") 
    assign(name, var[, columns[i], with=FALSE])} 

# Output: 
    color 
(chr) 
1  b 
2  g 
3  r 
4  y 
5 NA 

Kann mir jemand separaten Spalten, um am Ende mit (ungleicher Länge) helfen die keine NA-Werte enthalten, ohne die Spaltennamen einzugeben? (Eine andere Herangehensweise, als ich verwendet habe, ist sicherlich auch willkommen.) Danke im Voraus!

Antwort

3
sapply(columns, function(x) c(na.omit(dt[[x]])), USE.NAMES = T) 
#$color 
#[1] "b" "g" "r" "y" 
# 
#$size 
#[1] "S" "XL" "M" 
# 
#$number 
#[1] 1 2 3 4 5 

Die c() ist nicht notwendig - Ich habe es nur na.omit Klasse Info abzustreifen die Ausgabe klarer zu machen.

Und nicht assign verwenden - speichern Sie die Elemente in einer Liste wie oben und arbeiten Sie damit.

+0

Dank @eddi, das funktioniert ganz gut. Ich habe eine Liste mit jeder Spalte, die ich getrennt extrahieren kann, wenn ich möchte. Der Grund, dass ich Assign verwendet habe, ist, weil ich den Namen sein möchte, der die Spalten gibt, die auch automatisiert werden sollen. Mit Ihrer Antwort würde ich immer noch eine Schleife mit assign benötigen, um den Prozess des Extrahierens jeder Spalte aus der Liste zu automatisieren und ihnen gleichzeitig Namen zu geben. So hilft mir Ihre Antwort für die Hälfte der Frage, aber vielleicht ist das Problem der automatischen Benennung von Daten (Tabellen) durch die Verwendung von Zahlen/Indizes anstelle der Eingabe von Namen eine separate Frage! – Slycie

+0

@SophieClock Ich bin ein wenig verwirrt, was du meinst - die Liste oben hat Elemente genannt – eddi

+0

Hallo @eddi, werde ich versuchen zu erklären. Ich habe Spalten benannt, aber ich benutze sie lieber nicht. Dies liegt daran, dass mein reales Dataset Hunderte von Variablen enthält und dass das Eingeben all dieser Namen die ganze Zeit nicht effizient ist. Deshalb versuche ich, den Prozess zu automatisieren, indem ich zuerst eine Schleife benutze, die die Spalten nach Zahl erkennt und später eine Beschriftung auf diese Spalten lege (die ich automatisch in einem Array ablege, wenn ich die Daten einlese). – Slycie