2015-07-27 20 views
6

Tôi muốn cắt từng thành phần n của danh sách, cbind lát cắt và sau đó rbind các lát cắt.Tách danh sách mọi thành phần và phần tử n, sau đó rách các lát

Tôi có thể thực hiện điều này bằng mã bên dưới (n = 10 phần tử, danh sách dài 30 phần tử). Tôi 'theo cách thủ công' chọn mỗi 10 phần tử trong danh sách và sau đó là cbind 10 phần tử này. Sau đó, tôi rbind các lát cắt cbind đó.

Tuy nhiên, tôi nghĩ rằng có thể có cách này với l*ply trong plyr hoặc dplyr hoặc ít nhất một số trong số đó. Đối với người mới bắt đầu, tôi không phải bây giờ cách chọn mọi thành phần trong danh sách n và dường như không biết cụm từ tìm kiếm thích hợp để tìm câu trả lời này.

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

lẽ 'do.call (mapply, c (cbind, tách (dl, cắt (seq_along (dl), 3)))) ' –

+1

cũng' do.call (rbind, lapply (split (dl, rep (1: (length (dl)% /% 10), mỗi = 10)), simplify2array)) ' – jenesaisquoi

+1

@ StevenBeaupré dòng mã này dẫn đến kết quả mong muốn. Đối với sự hiểu biết của tôi, điều này sẽ 3 phần bằng nhau (tức là 'Cấp độ: (0,971,10,7] (10,7,20,3] (20,3,30]' dựa trên số lượng các phần tử trong danh sách, danh sách chia tách với những vết cắt đó và cbind chúng vào danh sách các danh sách, sau đó ánh xạ, 'rbinds' các danh sách đó – nofunsally

Trả lời

5

Hãy thử

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

giải pháp đẹp –

Các vấn đề liên quan