Изменение формата вывода split() в R

Предположим, что у меня есть следующий раскол:

x <- 1:5
K <- 2
y <- 5

split(sample(x), sample(1:K, y, replace = TRUE))
$'1'
[1] 3

$'2'
[1] 5 1 2 4

Есть ли способ привести это в форму?

[, 1] [, 2]
 [1, ] 3 5
 [2, ] 1
 [3, ] 2
 [4, ] 4
2 ответа

Вы можете заполнить эти пустые элементы NA, используя length<- тогда это было бы идеально для результата из sapply.

a <- split(sample(x), sample(1:K, y, replace = TRUE))
a
# $'1'
# [1] 2 3
#
# $'2'
# [1] 5 1 4

sapply(a, "length<-", max(lengths(a)))
# 1 2
# [1,] 2 5
# [2,] 3 1
# [3,] NA 4


Можно попробовать tidyverse основе tidyverse поскольку он обеспечит гибкость для непосредственного использования цепи dplyr. Логика состоит в том, чтобы stack список в data.frame, а затем использовать tidyr::spread для изменения данных в широком формате:

library(tidyverse)

set.seed(1)

split(sample(x), sample(1:K, y, replace = TRUE)) %>% 
 stack() %>%
 group_by(ind) %>% 
 mutate(rn = row_number()) %>% 
 spread(ind, values, fill = NA_integer_) %>%
 select(-rn) %>% as.data.frame()

# 1 2
# 1 1 2
# 2 NA 5
# 3 NA 4
# 4 NA 3

licensed under cc by-sa 3.0 with attribution.