2015-10-13 57 views
1

與市,條件和訂單號的數據幀開始使用,我試圖通過市&條件來創建訂單數的Ñ可能的組合([1],[2] ,[3],[1] & [2],[1] & [3],[2] & [3],[1] & [2] & [3])。創建n個組合While循環中的R

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) 

我能夠使用while()循環使用「combn」作爲我的ň容器親近的組合解決方案,但是我無法以可接受的格式將輸出保存到列表對象。

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 

上面的代碼通過列出所有的單個組合的靠攏,然後雙打其次是三元每個城市&條件,但我無法弄清楚如何去除港定居,關閉孔,然後保存到如下所示的列表對象。

所需的最終解決方案應該如下所示:

[[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" 

感謝您抽出一看,你可以提供任何幫助。列表中的條件:

回答

2

您可以使用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列現在有市的每個級別的所有子樣本。

爲了得到它在相同的格式,你想要的輸出,我們需要做一個小名單扯皮:

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) 
+0

感謝您回覆@jeremycg。不會使用n()總是導致爲每個城市/條件組使用所有訂單號碼?這是我的問題的核心。我需要能夠設置變量n並將其應用於每個組,而不管每個組有多少個訂單號。即第一組有15個訂單號碼,n = 2,所以我只想看到所有1:2組合,而不是1:15組合。 – Brian

+0

當然,在這種情況下,可以將'n()'換成你想要的數字,或者用'function(numberofrepeats)....將函數全部包裝到函數中,並用你的函數替換這兩個'n()'變量 – jeremycg

+0

對不起,我對goup_by不熟悉,所以我在如何將代碼包裝到另一個函數中掙扎。我很確定它必須在函數()中,但有些if()else條件,因爲如果給定組的Orders數少於_n_,它將會彈出。 – Brian