由R中的因子的k路组合定义的子集

时间:2017-03-27 11:18:20

标签: r

我想将一个函数(将是一个自定义函数,但为了简单起见,我会说它是mean)来应用由因子组合定义的子组。我有20个因素,但我想考虑一下由1,2,3,...,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应该有用,但不确定如何在这种情况下使用它们。

1 个答案:

答案 0 :(得分:0)

要为所有三个因子的所有组合计算mean var,您可以使用data.table by参数:

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个因子列(每个列有两到四个级别)。生成三个因子(即列)的所有可能组合(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