如何在矢量集而不是单个元素上展开.grid

时间:2016-04-12 13:07:29

标签: r tidyr

所以,我有以下四个载体

a1 <- c(11, 12)
a2 <- c(21, 22)

b1 <- c(31, 32)
b2 <- c(41, 42)

我最终想要的是一个看起来像

的数据框
  p1 p2 p3 p4
1 11 12 31 32
2 21 22 31 32
3 11 12 41 42
4 21 22 41 42

即。两个a向量与两个b向量的每种可能组合。

我做的是

ab <-  expand.grid(list(a1, a2), list(b1,b2))
ab.new <- ab %>% separate(Var1, c("p1", "p2"), sep = ",") 
             %>% separate(Var2, c("p3", "p4"), sep = ",")

我最终得到的是

    p1   p2   p3   p4
1 c(11  12) c(31  32)
2 c(21  22) c(31  32)
3 c(11  12) c(41  42)
4 c(21  22) c(41  42)

那些c(在那里做什么以及如何把它们拿出来?或者,在使用%>%时我做错了什么?

2 个答案:

答案 0 :(得分:2)

我们可以试试

do.call(cbind,lapply(expand.grid(list(a1, a2), list(b1,b2)),
               function(x) matrix(do.call(c, x), 4, 2, byrow=TRUE)))
#     [,1] [,2] [,3] [,4]
#[1,]   11   12   31   32
#[2,]   21   22   31   32
#[3,]   11   12   41   42
#[4,]   21   22   41   42

答案 1 :(得分:0)

仅使用base在一组向量上创建一个expand.grid的通用函数:

permu.sets <- function(listoflist) {
    #assumes that each list within listoflist contains vectors of equal lengths
    temp <- expand.grid(listoflist)  
    do.call(cbind, lapply(temp, function(x) do.call(rbind, x)))
} #permu.sets

a1 <- c(11, 12)
a2 <- c(21, 22)
b1 <- c(31, 32)
b2 <- c(41, 42)
permu.sets(list(list(a1, a2), list(b1,b2)))
来自@akrun的

diff是如何处理来自expand.grid的结果,而不需要明确传递维度