R:如何在向量和列表之间执行“外部产品”

时间:2015-09-18 03:49:01

标签: r list lapply

我有一个向量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

我需要将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" ,就像使用数组做外部产品一样,最终看起来像这样:

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

请注意,V中的元素不仅出现在每个子子列表中,而且还作为每个子列表的名称。

我想出的是:

lapply

嵌套的outer函数看起来很难看,反直觉。我尝试通过在基础R中尝试rlist函数来消除它,但显​​然这不起作用。所以我正在寻找一种仍然“功能”但更清洁,更直观的解决方案。谢谢!

P.S。我最近在学习rlist并发现它非常方便,所以loginFb解决方案也非常有用。 @坤仁

1 个答案:

答案 0 :(得分: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"))