[英]Create n Combinations Using While Loop in R
從城市,條件和訂單號的數據幀開始,我試圖按城市和條件創建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"
感謝您查看並提供任何幫助。
您可以使用dplyr
獲取列表的data.frame:
library(dplyr)
newdat <- dat %>% group_by(City, Condition) %>%
summarise(lists = list(lapply(1:n(),
function(z){combinations(v=Order.No, r=z, n=n())})))
newdat
Source: local data frame [2 x 3]
Groups: City [?]
City Condition lists
(fctr) (fctr) (chr)
1 Chicago B <list[2]>
2 St. Louis A <list[3]>
現在, newdat$lists
列在列表中具有City:Condition的每個級別的所有子樣本。
要以與所需輸出相同的格式獲取它,我們需要做一些清單整理:
unlist(lapply(unlist(newdat$lists, recursive = FALSE),
function(x){as.list(data.frame(t(x)))}), recursive = FALSE)
$X1
[1] 89
$X2
[1] 95
$t.x.
[1] 89 95
$X1
[1] 36
$X2
[1] 47
$X3
[1] 81
$X1
[1] 36 47
$X2
[1] 36 81
$X3
[1] 47 81
$t.x.
[1] 36 47 81
編輯:作為功能:
lister <- function(data, numgroups){
data %>% group_by(City, Condition) %>%
summarise(lists = list(lapply(1:min(numgroups, n()),
function(z){combinations(v=Order.No, r=z, n=n())})))
}
例如:
lister(dat, 2)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.