2017-06-29 1 views
1

Wie kann ich einen Vektor an eine Liste von data.frames binden/anhängen?Wie hängt man einen Vektor an eine Liste von data.frames an?

l <- list(data.frame(a=c(1,2,3), b=c(1,2,3)), data.frame(a=c(1,2,3,4), b=c(1,2,3,4))) 
l 
file_name <- c("myfile.txt", "yourfile.txt") 
file_name 

Ich habe versucht:

lapply(l, function(x) cbind(l[[x]], fname = rep(file_name, each = nrow(l[[x]])))) 

aber ich erhalte eine Fehlermeldung:

Error in l[[x]] : invalid subscript type 'list'

Antwort

1

Wir Map-create a new column 'fname' for each of the list` Elemente verwenden können, indem man die entsprechende 'file_name', um es anhängt

Map(cbind, l, fname = file_name) 

Wenn wir lapply verwenden, dann Schleife durch die Sequenz des list

lapply(seq_along(l), function(i) transform(l[[i]], fname = file_name[i])) 
0

Nur um sicher zu machen .. Sie haben die folgende Liste von data.frames ..

l <- list(data.frame(a=c(1,2,3), b=c(1,2,3)), data.frame(a=c(1,2,3,4), b=c(1,2,3,4))) 
l 
[[1]] 
    a b 
1 1 1 
2 2 2 
3 3 3 

[[2]] 
    a b 
1 1 1 
2 2 2 
3 3 3 
4 4 4 

Wo Sie möchten schließlich einen Vektor (der sich je nach Liste unterscheidet) an alle Datenrahmen in der Liste anhängen. Damit möchten Sie

[[1]] 
    a b v 
1 1 1 a 
2 2 2 b 
3 3 3 c 

[[2]] 
    a b v 
1 1 1 a 
2 2 2 b 
3 3 3 c 
4 4 4 d 

Ein Trick, den wir zu dem ersten Gebrauch rbindlist tun können .. alle Rahmen zusammen zu bekommen und halten ist ihre ID

L = rbindlist(l,idcol = TRUE) 

Und lassen Sie uns sagen, dass wir auch eine Liste, die wir zu jedem Daten anhängen wollte .frame

v = list(data.frame(v = letters[1:3]), data.frame(v = LETTERS[1:4])) 
V = rbindlist(v) 

Jetzt können wir eine einfache cbind tun und teilen dann die Liste der .id verwenden, die wir

result = cbind(L,V) 
final_result = split(result,on = ".id") 

    $`1` 
    .id a b v 
1: 1 1 1 a 
2: 1 2 2 b 
3: 1 3 3 c 

$`2` 
    .id a b v 
1: 2 1 1 A 
2: 2 2 2 B 
3: 2 3 3 C 
4: 2 4 4 D 

erstellt wir haben noch eine .id col haben umm .. aber das sollte nicht zu viel Mühe sein, um dieses los zu werden.

Verwandte Themen