Разделить список каждые n элементов и cbind, затем rbind срезы

Я хотел бы нарезать все n элементы списка, cbind фрагмент, а затем rbind фрагменты.

Я могу сделать это с помощью приведенного ниже кода (n = 10 элементов, список длиной 30 элементов). Я «вручную» выбираю каждые 10 элементов списка, а затем cbind эти 10 фрагментов элементов. Затем я rbind эти cbinded ломтики.

Тем не менее, я думаю, что может быть путь к этому с l*ply в plyr или dplyr, или, по крайней мере, в некоторых из них. Во-первых, я сейчас не знаю, как выбрать все n элементы списка, и, похоже, не знаю подходящего условия поиска, чтобы найти этот ответ.

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)

person nofunsally    schedule 27.07.2015    source источник
comment
Возможно do.call(mapply, c(cbind, split(dl, cut(seq_along(dl), 3))))   -  person Steven Beaupré    schedule 27.07.2015
comment
также do.call(rbind, lapply(split(dl, rep(1:(length(dl)%/%10), each=10)), simplify2array))   -  person Rorschach    schedule 27.07.2015
comment
@StevenBeaupré, эта строка кода приводит к желаемому результату. Насколько я понимаю, это будет 3 равные части (т.е. Levels: (0.971,10.7] (10.7,20.3] (20.3,30] в зависимости от количества элементов в списке, разделите список с помощью этих сокращений и свяжите их в список списков, а затем выполните сопоставление, «rbinds» эти списки.   -  person nofunsally    schedule 27.07.2015
comment
Для dplyr и первой части вашего вопроса см. row_number -- dl %>% group_by(row_number() %/% 10). Это будет после преобразования dl в data.frame, возможно, через data.frame(t(matrix(unlist(dl), 7)))   -  person user295691    schedule 27.07.2015


Ответы (1)


Пытаться

do.call(mapply, c(cbind, split(dl, cut(seq_along(dl), length(dl)/10, labels = FALSE))))
person Steven Beaupré    schedule 27.07.2015