2015-09-18 3 views
0

Я получил вектор V <- c("a","b","c","d","e")R: Как выполнить «внешний продукт» между вектором и списком

и список L который выглядит следующим образом:

> str(L) 
List of 2 
$ A:List of 2 
    ..$ alpha: num 1 
    ..$ beta : num 2 
$ B:List of 2 
    ..$ alpha: num 1 
    ..$ beta : num 2 

мне нужно распространять из элементов V Into L как делают внешний продукт с массивами, так что он в конце концов выглядит следующим образом:

> str(L3) 
List of 5 
$ a:List of 2 
    ..$ A:List of 3 
    .. ..$ alpha: num 1 
    .. ..$ beta : num 2 
    .. ..$ gamma: chr "a" 
    ..$ B:List of 3 
    .. ..$ alpha: num 1 
    .. ..$ beta : num 2 
    .. ..$ gamma: chr "a" 
$ b:List of 2 
    ..$ A:List of 3 
    .. ..$ alpha: num 1 
    .. ..$ beta : num 2 
    .. ..$ gamma: chr "b" 
    ..$ B:List of 3 
    .. ..$ alpha: num 1 
    .. ..$ beta : num 2 
    .. ..$ gamma: chr "b" 
$ c:List of 2 
    ..$ A:List of 3 
    .. ..$ alpha: num 1 
    .. ..$ beta : num 2 
    .. ..$ gamma: chr "c" 
    ..$ B:List of 3 
    .. ..$ alpha: num 1 
    .. ..$ beta : num 2 
    .. ..$ gamma: chr "c" 
$ d:List of 2 
    ..$ A:List of 3 
    .. ..$ alpha: num 1 
    .. ..$ beta : num 2 
    .. ..$ gamma: chr "d" 
    ..$ B:List of 3 
    .. ..$ alpha: num 1 
    .. ..$ beta : num 2 
    .. ..$ gamma: chr "d" 
$ e:List of 2 
    ..$ A:List of 3 
    .. ..$ alpha: num 1 
    .. ..$ beta : num 2 
    .. ..$ gamma: chr "e" 
    ..$ B:List of 3 
    .. ..$ alpha: num 1 
    .. ..$ beta : num 2 
    .. ..$ gamma: chr "e" 

Уведомление-й в элементах из V не только появляются внутри каждого под-под-списка, но также служат в качестве имени каждого под-списка.

То, что я придумал это:

L3 <- lapply(V, function(x) lapply(L,function(y) c(y,gamma = x))) 
L3 <- setNames(L3, V) 

Вложенная lapply функция выглядит некрасиво и нелогичным для меня. Я попытался устранить это, попробовав функцию outer в базе R, но ясно, что это не работает. Поэтому я ищу решение, которое все еще «функционально», но более чистым и интуитивным. Благодаря!

P.S. Недавно я изучаю rlist и нашел, что это очень удобно, поэтому решение rlist также очень weclomed. @ Кун-жэнь

+1

Похоже у вас есть очень хороший метод уже –

+0

@RichardScriven На самом деле я заинтересован, чтобы увидеть 'rlist' решение. Я думаю, что это должно иметь какое-то отношение к 'list.map' и' list.update', но я не совсем понял, как перевести 'lapply' в' list.map'. – Benny

+0

@RichardScriven Я видел ваш удаленный ответ. Это смешанный подход, но он, безусловно, информативный. Благодарю. – Benny

ответ

1

Я не знаком с rlist, но только от мастерить это выглядит, как вы можете сделать

library(rlist) 
setNames(Map(list.update, rep(list(L), length(V)), gamma = V), V) 

Но это, кажется, не лучше, чем то, что вы уже сделали с lapply(). str() выглядит так же, как и у вас в вопросе.

данных:

L <- structure(list(A = structure(list(alpha = 1, beta = 2), .Names = c("alpha", 
"beta")), B = structure(list(alpha = 1, beta = 2), .Names = c("alpha", 
"beta"))), .Names = c("A", "B")) 
Смежные вопросы