【发布时间】:2016-01-11 11:29:20
【问题描述】:
从城市、条件和订单号的数据框开始,我正在尝试按城市和条件创建 n 个可能的订单号组合([1]、[2]、[3 ]、[1]&[2]、[1]&[3]、[2]&[3]、[1]&[2]&[3])。
library(gtools)
set.seed(123)
dat <- data.frame(City = c(rep("St. Louis", 3), rep("Chicago", 2)),
Condition = c(rep("A", 3), rep("B", 2)),
Order.No = round(runif(5,10,100),0))
按城市和条件划分:
dat_groups <- lapply(split(dat, list(dat$City, dat$Condition)), function(x) {
x$Order.No
})
> dat_groups
$Chicago.A
numeric(0)
$`St. Louis.A`
[1] 36 81 47
$Chicago.B
[1] 89 95
$`St. Louis.B`
numeric(0)
我可以使用带有“combn”的 while() 循环作为 n 的容器来接近组合解决方案,但是我无法将输出保存到列表对象以可接受的格式。
combn <- 4
counter <- 0
while (counter <= combn) {
counter <- counter + 1
temp <- lapply(dat_groups, function(x) {
n_obs <- length(x)
if(n_obs == 0) {
NA
}
if(n_obs > 0 & n_obs >= counter) {
combinations(n_obs, counter, x)
} else {
NA
}
})
print(temp)
}
$Chicago.A
[1] NA
$`St. Louis.A`
[,1]
[1,] 36
[2,] 47
[3,] 81
$Chicago.B
[,1]
[1,] 89
[2,] 95
$`St. Louis.B`
[1] NA
$Chicago.A
[1] NA
$`St. Louis.A`
[,1] [,2]
[1,] 36 47
[2,] 36 81
[3,] 47 81
$Chicago.B
[,1] [,2]
[1,] 89 95
$`St. Louis.B`
[1] NA
$Chicago.A
[1] NA
$`St. Louis.A`
[,1] [,2] [,3]
[1,] 36 47 81
...............
truncated
上面的代码通过列出所有单个组合来接近,然后是每个城市和条件的双打,然后是三倍,但我不知道如何删除 NA,关闭漏洞,然后保存到列表中像下面这样的对象。
所需的最终解决方案应如下所示:
[[1]]
[1] "36"
[[2]]
[1] "81"
[[3]]
[1] "47"
[[4]]
[1] "36" "81"
[[5]]
[1] "36" "47"
[[6]]
[1] "81" "47"
[[7]]
[1] "36" "81" "47"
[[8]]
[1] "89"
[[9]]
[1] "95"
[[10]]
[1] "89" "95"
感谢您查看并提供任何帮助。
【问题讨论】:
标签: r loops while-loop combinations