我在列表中有几个(命名的)向量:
data = list(a=runif(n = 50, min = 1, max = 10), b=runif(n = 50, min = 1, max = 10), c=runif(n = 50, min = 1, max = 10), d=runif(n = 50, min = 1, max = 10))
我想根据另一个名为combs的数组中的行来使用它们的不同组合:
var <- letters[1:length(data)]
combs <- do.call(expand.grid, lapply(var, function(x) c("", x)))[-1,]
我希望能够提取每个组合,以便我可以使用这些组合创建的向量 所有这些都是为了能够将函数应用于提取的每一行,然后应用于这些数据帧的每个组合。例如:
# Row 5 is "a", "c"
combs[5,]
# Use this information to extract this particular combination from my data:
# by hand it would be:
res_row5 = cbind(data[["a"]], data[["c"]])
# Extract another combination
# Row 11 is "a", "b", "d"
combs[11,]
res_row11 = cbind(data[["a"]], data[["b"]], data[["d"]])
# So that I can apply functions to each row across all these vectors
res_row_5_func = apply(res_row5, 1, sum)
# Apply another function to res_row11
res_row_5_func = apply(res_row11, 1, prod)
# Multiply the two, do other computations which can do as long as I have extracted the right vectors
我在这里问了一个非常相似的问题:Is there an easy way to match values of a list to array in R?
但无法弄清楚如何提取实际数据...... 非常感谢!
答案 0 :(得分:1)
您可以做的是首先生成索引data
中相关条目的向量列表:
library(magrittr)
combList <- lapply(1:nrow(combs), function(ii) combs[ii,] %>% unlist %>% setdiff(""))
然后,您可以使用此列表为data
中的列编制索引,并生成所需矩阵的新列表:
dataMatrixList <- lapply(combList, function(indVec) data[indVec] %>% do.call('cbind', .))
dataMatrixList
中的第i个条目包含一个矩阵,其中的列对应combs
中的第i行。然后,您可以使用
rowSumsList <- lapply(dataMatrixList, function(x) apply(x, 1, sum))
答案 1 :(得分:1)
这将是另一种方法,我认为你想要的是什么?它将通过按每行梳子的(非空)元素对数据列表进行子集化来返回数据帧列表:
data_sets <- apply(combs,
1,
function(x) do.call(cbind.data.frame, data[unlist(x[x!=''])])
)