2016-08-19 2 views
2

Ich habe zwei Listen: eine enthält mehrere Datenrahmen mit unterschiedlicher Länge. Für jede Länge habe ich ein entsprechendes Array in einer Liste von Arrays und nun möchte ich diese Arrays als Spaltennamen auf den Vektor gleicher Länge anwenden.Übereinstimmende Vektoren von einer Liste zu Datenrahmen in einer anderen Liste nach Länge

for (i in 1:10){ 
assign(paste0("var",i), c(1:10)) 
} 

df1 <- data.frame(var1,var2) 
df2 <- data.frame(var3,var4,var5) 
df3 <- data.frame(var6,var7,var8,var9) 
df4 <- data.frame(var10) 
df5 <- data.frame(var1,var2) 
df6 <- data.frame(var3,var4,var5) 
df7 <- data.frame(var6,var7,var8,var9) 
df8 <- data.frame(var10) 

my.list <- list(df1,df2,df3,df4) 

names1 <- c("aa","bb") 
names2 <- c("cc","dd","ee") 
names3 <- c("ff","gg","hh","ii") 
names4 <- c("jj") 

my.list.names <- list(names1,names2,names3,names4) 

for (i in 1:length(my.list)){ 
    if (length(my.list[[i]]) == length(my.list.names)) 
    colnames(my.list[[i]]) <- my.list.names 
} 

Ich kann sehen, warum meine Lösung nicht wirklich funktioniert. Ich muss nicht nur über jeden Datenrahmen in my.list, sondern auch über jeden möglichen Vektor von my.list.names gehen und dann sehen, ob sie übereinstimmen.

Ich kann nicht wirklich meinen Kopf um diese "Schleife in einer Schleife Sache" wickeln. Ich habe auch elegantere Lösungen mit angewendet. Aber ich lande am selben Punkt. Es scheint auch noch eine weitere if-Bedingung am Ende zu fehlen, aber es scheint nicht wirklich richtig zu sein, das, was ich geschrieben habe, erneut zu spezifizieren, als ob die Aussage eine Zeile früher wäre.

Antwort

1

Sie sind ziemlich nah - man muss nur eine innere Schleife müssen die Länge der Spaltennamen zu überprüfen und ordnen sie, wenn sie die Länge (Anzahl der Spalten) in dem Datenrahmen entsprechen:

for (i in seq_along(my.list)){ 
    for (cols in my.list.names){ 
    if(length(my.list[[i]]) == length(cols)) { 
     names(my.list[[i]]) <- cols 
    } 
    } 
} 

(Achten Sie auch auf Ihren Gesamtansatz - es wird davon ausgegangen, dass es nur einen Vektor innerhalb my.list.names einer gegebenen Länge gibt und dass mindestens ein Vektor von Spaltennamen für jeden Datenrahmen einer gegebenen Länge existiert.)

0

Solange Es gibt keine Lücken in der Anzahl der Spaltennamen Vektoren (dh nicht so etwas wie 1 varname, 2 varnames, 3 varnames, 4 varnames, 6 ein Variablenname), die in dem Beispiel gilt, sollte die Lösung unterhalb den Trick:

# put names into a list, assumes no other objects with "names" in their name 
namesList <- mget(ls(pattern="names")) 
# sort names by length, this assumes no gaps in column count 
namesList <- namesList[order(lengths(namesList))] 

# add names to list of data.frames 
my.list <- lapply(my.list, function(i) setNames(i, namesList[[length(i)]])) 

Das erste Element der Liste ist

my.list[[1]] 
    aa bb 
1 1 1 
2 2 2 
3 3 3 
4 4 4 
5 5 5 
6 6 6 
7 7 7 
8 8 8 
9 9 9 
10 10 10 
Verwandte Themen