2017-03-27 64 views
2

我想將一個函數(將是一個自定義函數,但爲了簡單起見,我會說它是mean)通過因子組合定義的子羣。我有20個因素,但我想考慮,例如,所有1,2,3,...,k因素組合定義的子組。通過R中的k因子組合因子定義的子集

這裏是k=3

N = 100 
test_data <- data.frame(factorA = factor(sample(1:4, replace = TRUE, size = N)), factorB = factor(sample(1:2, replace = TRUE, size = N)), factorC = factor(sample(1:2, replace = TRUE, size = N)), var = rnorm(n = N)) 

#1-way subsets 
mean(test_data$var[test_data$factorA == "1"]) 
mean(test_data$var[test_data$factorA == "2"]) 
mean(test_data$var[test_data$factorA == "3"]) 
mean(test_data$var[test_data$factorA == "4"]) 
mean(test_data$var[test_data$factorB == "1"]) 
#and so forth... 

#2-way subsets 
mean(test_data$var[test_data$factorA == "1" & test_data$factorB == "1" ]) 
mean(test_data$var[test_data$factorA == "1" & test_data$factorB == "2" ]) 
mean(test_data$var[test_data$factorA == "1" & test_data$factorC == "1" ]) 
#and so forth... 

#3-way subsets 
mean(test_data$var[test_data$factorA == "1" & test_data$factorB == "1" & test_data$factorC == "1" ]) 
mean(test_data$var[test_data$factorA == "1" & test_data$factorB == "1" & test_data$factorC == "2" ]) 
#and so forth... 

對於k各因素組合的示例,計算的var平均爲這些k因子水平的所有組合。如果輸出被標記爲定義該子集的給定的因子/等級組合,那將是最好的。

看來expand.grid和/或combn應該是有用的,但不知道如何在這種情況下使用它們。

回答

0

要計算的varmean所有組合所有三個因素,你可以使用data.tableby說法:

library(data.table) 
N = 100 
test_data <- data.frame(factorA = factor(sample(1:4, replace = TRUE, size = N)), 
    factorB = factor(sample(1:2, replace = TRUE, size = N)), 
    factorC = factor(sample(1:2, replace = TRUE, size = N)), var = rnorm(n = N)) 
setDT(test_data) 
test_data[, .(mean_var = mean(var, na.rm = TRUE)), 
    by = .(factorA, factorB, factorC)] 

哪個給出了這樣的輸出:

factorA factorB factorC  mean_var 
1:  1  1  1 -0.304218613 
2:  1  1  2 -0.122405096 
3:  1  2  1 0.532219871 
4:  1  2  2 -0.679400706 
5:  2  1  1 0.006901209 
6:  2  1  2 0.605850466 
7:  2  2  1 -0.083305497 
8:  2  2  2 -0.408660971 
9:  3  1  1 -0.362234218 
10:  3  1  2 -0.368472511 
11:  3  2  1 0.243274183 
12:  3  2  2 0.119927615 
13:  4  1  1 -0.517337915 
14:  4  1  2 -0.790908511 
15:  4  2  1 -0.077665828 
16:  4  2  2 -0.295695277 

更新與包含20個因子列的示例數據(每個具有2至4個級別)。的三個因素(即列)的所有可能的組合被生成(6480),併爲每個組合的mean_var爲因子levels的每個唯一組合的計算方法:

library(data.table) 
# Generate example data 
N = 100 
dt <- dcast(rbindlist(lapply(seq(1:20), function(x) { 
    dt_tmp <- data.table(id = 1:N, factor = paste0("factor", LETTERS[x]), 
    value = sample(1:sample(2:4, 1), replace = TRUE, size = N)) 
})), id~factor)[, ":="(var = rnorm(n = N), id = NULL)] 

# Generate all combinations of three out of the 20 factors (20*19*18 = 6840) 
factors <- colnames(dt[, 1:20]) 
tests <- CJ(k1 = factors, k2 = factors, k3 = factors)[k1 != k2 & k1 != k3 & k2 != k3] 

# Iterate over every row of tests and calculate mean_var for each unique 
# combination of the three factors (this takes time - output ~ 170000 rows) 
dt_out <- rbindlist(lapply(seq(1:nrow(tests)), function(x) { 
    dt[, .(mean_var = mean(var, na.rm = TRUE)), 
     by = c(tests[x, k1], tests[x, k2], tests[x, k3])] 
}), use.names = TRUE, fill = TRUE) 

輸出看起來像這樣:

> head(out_dt, 30) 
    factorA factorB factorC  mean_var factorD factorE factorF factorG factorH factorI factorJ factorK factorL factorM factorN factorO factorP factorQ factorR factorS factorT 
1:  1  2  3 -0.595391823  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA 
2:  2  1  1 -0.049915238  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA 
3:  2  2  4 0.087206182  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA 
4:  2  1  2 0.010622079  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA 
5:  1  2  1 0.277414685  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA 
6:  1  1  3 0.366482963  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA 
7:  2  2  3 0.017438655  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA 
8:  2  2  1 -1.116071505  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA 
9:  2  1  4 1.371340706  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA 
10:  2  2  2 0.045354904  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA 
11:  1  2  2 0.644926008  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA 
12:  1  2  4 -0.121767568  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA 
13:  1  1  2 0.261070274  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA 
14:  2  1  3 -0.506061865  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA 
15:  1  1  4 -0.075228598  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA 
16:  1  1  1 0.333514316  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA 
17:  1  2  NA -0.185980008  1  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA 
18:  2  1  NA -0.113793548  1  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA 
19:  2  2  NA 0.015100176  2  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA 
20:  1  2  NA 0.484182038  2  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA 
21:  1  1  NA -0.123811140  2  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA 
22:  1  1  NA 0.543852715  1  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA 
23:  2  2  NA -0.267626769  1  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA 
24:  2  1  NA 0.133316773  2  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA 
25:  1  2  NA 0.538964320  NA  1  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA 
26:  2  1  NA 0.006298113  NA  1  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA 
27:  2  2  NA 0.010152043  NA  2  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA 
28:  2  1  NA 0.011377912  NA  2  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA 
29:  1  1  NA 0.504610954  NA  2  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA 
30:  2  2  NA -0.311834384  NA  1  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA 
    factorA factorB factorC  mean_var factorD factorE factorF factorG factorH factorI factorJ factorK factorL factorM factorN factorO factorP factorQ factorR factorS factorT 
+0

謝謝,這是一個好的開始。但是,我有20個因素,我想爲三個因素的每個組合做到這一點。我想結合你的答案和'combn'應該有效嗎? –