2015-07-27 15 views
6

Chciałbym wyciąć każdy element n elementów listy, cbind plasterka, a następnie rbind plasterków.Podziel listę co n elementów i cbind, następnie plasterki rbind

Mogę to zrobić za pomocą poniższego kodu (n = 10 elementów, lista ma 30 elementów). Ja "ręcznie" wybieram co 10 elementów z listy, a następnie cbind tych 10 kawałków elementów. I wtedy rbind te plasterki.

Jednak myślę, że może być sposób na to z l*ply w plyr lub dplyr, lub przynajmniej niektóre z nich. Na początek nie mam teraz sposobu wybierania elementów listy z listy i wydaje mi się, że nie znają odpowiedniego szukanego terminu, aby znaleźć tę odpowiedź.

dl <- list(c(2L, 1L, 3L, 2L, 1L, 1L, 3L), c(1L, 1L, 2L, 1L, 1L, 2L, 
1L), c(1L, 1L, 2L, 2L, 3L, 3L, 3L), c(1L, 1L, 2L, 2L, 3L, 3L, 
3L), c(1L, 1L, 2L, 2L, 3L, 3L, 3L), c(1L, 1L, 2L, 2L, 3L, 3L, 
1L), c(1L, 1L, 2L, 2L, 3L, 3L, 3L), c(1L, 3L, 2L, 1L, 3L, 2L, 
1L), c(3L, 1L, 2L, 3L, 3L, 1L, 3L), c(3L, 2L, 1L, 1L, 3L, 3L, 
1L), c(1L, 1L, 2L, 2L, 2L, NA, NA), c(1L, 1L, 2L, 2L, 3L, NA, 
NA), c(1L, 1L, 2L, 2L, 3L, NA, NA), c(1L, 1L, 2L, 2L, 3L, NA, 
NA), c(1L, 1L, 2L, 2L, 3L, NA, NA), c(1L, 1L, 2L, 2L, 3L, NA, 
NA), c(1L, 1L, 2L, 2L, 3L, NA, NA), c(1L, 1L, 2L, 2L, 3L, NA, 
NA), c(1L, 1L, 2L, 2L, 3L, NA, NA), c(2L, 1L, 2L, 1L, 1L, NA, 
NA), c(2L, 3L, 1L, 2L, 1L, 2L, NA), c(1L, 1L, 2L, 2L, 1L, 3L, 
NA), c(1L, 1L, 2L, 2L, 3L, 3L, NA), c(1L, 1L, 2L, 2L, 3L, 3L, 
NA), c(1L, 1L, 2L, 2L, 3L, 3L, NA), c(1L, 1L, 2L, 2L, 3L, 3L, 
NA), c(1L, 1L, 2L, 2L, 3L, 3L, NA), c(1L, 1L, 2L, 2L, 3L, 3L, 
NA), c(1L, 1L, 2L, 2L, 3L, 3L, NA), c(1L, 1L, 2L, 2L, 3L, 3L, 
NA)) 

# slice list 'manually' cbind those slices 
dl1 <- dl[1:10] 
dl1.c <- do.call("cbind", dl1) 
dl2 <- dl[11:20] 
dl2.c <- do.call("cbind", dl2) 
dl3 <- dl[21:30] 
dl3.c <- do.call("cbind", dl3) 

# rbind the cbind slices for result 
ans <- as.data.frame(rbind(dl1.c, dl2.c, dl3.c)) # ans as df 
# ans <- rbind(dl1.c, dl2.c, dl3.c) 
+2

Maybe 'do.call (mapply, c (cbind, split (dl, cięte (seq_along (DL), 3))))' ' –

+1

również do.call (rbind, lapply (split (dl, rep (1: (długość (dl)% /% 10), każdy = 10)), uproszczenie2array)) ' – jenesaisquoi

+1

@ StevenBeaupré ta linia kodu daje pożądane wyniki. Dla mojego zrozumienia, będzie to 3 równe części (tj. 'Poziomy: (0,971,10,7) (10,20,2) (20,30)' oparte na liczbie elementów na liście, lista rozdzielona z tymi cięciami i cind je do listy list, a następnie mapply, 'rbinds' te listy. – nofunsally

Odpowiedz

5

Spróbuj

do.call(mapply, c(cbind, split(dl, cut(seq_along(dl), length(dl)/10, labels = FALSE)))) 
+2

piękne rozwiązanie –

Powiązane problemy