如何 expand.grid 向量集而不是单个元素
How to expand.grid on vectors sets rather than single elements
所以,我有以下四个向量
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(
在那里做什么,如何让他们出来?或者,我在使用 %>%
时做错了什么?
我们可以试试
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
仅使用 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 答案的不同之处在于如何处理来自 expand.grid 的结果而不需要显式传递维度
所以,我有以下四个向量
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(
在那里做什么,如何让他们出来?或者,我在使用 %>%
时做错了什么?
我们可以试试
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
仅使用 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 答案的不同之处在于如何处理来自 expand.grid 的结果而不需要显式传递维度