2017-01-18 5 views
3

Wie ich das erste „lange“ Liste l verwandeln kann:Schalten Liste in „Liste der Listen“

l <- list() 
n=1 
for (i in 1:9) { 
    l[[length(l)+1]] <- n:(n+2) 
    n=n+3 
} 

in ein breiter, aber kürzer Liste von Listen lol: Im nächsten Codesegment im Bruch nach jedem 3 Elemente von l.

lol <- list() 
lol[[1]] <- list(1:3,4:6,7:9) 
lol[[2]] <- list(10:12,13:15,16:18) 
lol[[3]] <- list(19:21,22:24,25:27) 

Irgendwelche Ideen? Was, wenn ich nach 2 Elementen von l.

Antwort

2

Sie können es durch einen Vektor gespalten 1,1,1,2,2,2,3,3,3:

n = 3          # the length of each sub list 
split(l, (seq_along(l) - 1) %/% n) 

identical(lol, setNames(split(l, (seq_along(l) - 1) %/% 3), NULL)) 
# [1] TRUE 
+1

Dies ist nicht der 'identical' überprüfen nicht passieren, aber eine andere Art und Weise:' tapply (l, rep (1: 3, jeweils = 3), FUN = c) ' – Frank

+0

@Psidom perfekte Lösung! –

+1

@Frank ich glaube es ist wegen der Namen der Listenelemente. Ihre Lösung ist nicht allgemein genug. Zum Beispiel, wenn Sie durch 2 teilen, funktioniert es nicht. Netter Gebrauch von Tapply sowieso! –