как «расчесать» каждую комбинацию каждого элемента вектора в один список

Мне не удалось найти, как сделать это конкретное преобразование. У кого-нибудь есть умный способ добиться этого? извините, если я где-то пропустил очевидный ответ. Спасибо

# start with a single vector
1:3

# achieve this desired structure, containing every combination
# from combn( x , 1 ) thru combn( x , length( x ) )
list(
    1 ,
    2 , 
    3 ,
    c( 1 , 2 ) ,
    c( 1 , 3 ) ,
    c( 2 , 3 ) ,
    c( 1 , 2 , 3 )
)

person Anthony Damico    schedule 07.12.2018    source источник


Ответы (1)


Прокрутите последовательность значений, получите combn вектора с m указанными в качестве значений последовательности, split с помощью 'col', сгладьте вложенный список до list из vectors с do.call(c и unname it

unname(do.call(c, lapply(1:3, function(x) {
      x1 <- combn(1:3, x)
      split(x1, col(x1))})))
#[[1]]
#[1] 1

#[[2]]
#[1] 2

#[[3]]
#[1] 3

#[[4]]
#[1] 1 2

#[[5]]
#[1] 1 3

#[[6]]
#[1] 2 3

#[[7]]
#[1] 1 2 3

Или как @IceCreamToucan упомянул в комментариях

do.call(c, lapply(1:3, function(x) combn(1:3, x, simplify = FALSE)))
person akrun    schedule 07.12.2018
comment
Хороший! Вы можете упростить функцию до function(x) combn(1:3, x, simplify = F) - person IceCreamToucan; 07.12.2018
comment
@IceCreamToucan Спасибо, это так компактно. Я забыл аргумент simplify. - person akrun; 07.12.2018
comment
Спасибо! может быть, это должно быть myfun <- function( w ) do.call(c, lapply(seq(w), function(x) combn(w, x, simplify = FALSE))), чтобы он работал с векторами символов? - person Anthony Damico; 07.12.2018
comment
@AnthonyDamico Да, я думаю, что seq_along(w) будет немного быстрее. не проверял - person akrun; 07.12.2018