生成给定集合的所有可能子集并进行一些计算

时间:2020-01-09 11:14:19

标签: r

我有一个看起来像这样的数据框

subj trial  factor   rt
1     1     Early    324 
1     2     Early    405 
1     3     Early    293 
1     4     Early    738 
1     5     Late     310 
1     6     Late     389 
1     7     Late     350 
1     8     Late     782 
1     9     Late     513 
1    10     Late     401 
2     1     Early    420 
2     2     Early    230 
2     3     Early    309 
2     4     Late     456 
2     5     Late     241 
2     6     Late     400 
2     7     Late     189 
2     8     Late     329 
2     9     Late     519 
2    10     Late     230 
3     1     Early    299 
3     2     Early    499 
3     3     Late     403 
3     4     Late     389 
3     5     Late     356 
3     6     Late     365 
3     7     Late     234 
3     8     Late     345 
3     9     Late     300 
3     10    Late     402

如您所见,两种情况的试验次数都不相同。

我想要为每个参与者做的是,计算每种条件下的试验次数(对于参与者1,它将是Early = 3和Late = 7,对于参与者2是Early = 4,Late = 6,以及参与者3是早= 2和晚8)。

早期条件的试验次数将决定我要生成的子集的大小。同样,对于参与者1,我想在“晚期”条件下生成7个试验中3个试验的所有可能组合,并为每个组合计算平均值。我不知道我的解释是否正确。

所以,它会变成这样。由于参与者1在早期条件下仅进行了3次试验,因此我将计算这3次试验的平均rt得分。但是对于后期情况,我想生成所有可能的试验组合,例如4 5 6、4 5 7、4 5 8、4 5 9、4 5 10、4 6 7、4 6 8、4 6 9、4 6 10等,然后计算每种试验组合的rt均值,然后计算晚期疾病的一般均值。

我不知道该怎么做。我知道expand.grid()函数可以帮助组合部分,但是我真的不知道如何通过早期疾病的试验次数来定义组合的数量,因为每个参与者的情况都会有所不同。 >

我不知道我是否足够清楚,但我希望有人可以帮助遮挡一些光线。

谢谢大家!

2 个答案:

答案 0 :(得分:3)

这是基本的R解决方案。您可以定义自定义函数$data_id = 957; $prepare = $wpdb->prepare("SELECT * FROM " . $this->tables->tableCustomer() . " WHERE Id = %d", $data_id); $wpdb->get_results($prepare, ARRAY_A); 来计算组合的平均值

combavg

,然后使用以下行获取结果

combavg <- function(x) {
  r <- data.frame(t(combn(which(x$factor == "Late"),sum(x$factor == "Early"), function(v) c(v,mean(x$rt[v])))))
  names(r)[ncol(r)] <- "rt.avg"
  r
}

这样

res <- Map(combavg,split(df,df$subj))

数据

> res
$`1`
   X1 X2 X3 X4 rt.avg
1   5  6  7  8 457.75
2   5  6  7  9 390.50
3   5  6  7 10 362.50
4   5  6  8  9 498.50
5   5  6  8 10 470.50
6   5  6  9 10 403.25
7   5  7  8  9 488.75
8   5  7  8 10 460.75
9   5  7  9 10 393.50
10  5  8  9 10 501.50
11  6  7  8  9 508.50
12  6  7  8 10 480.50
13  6  7  9 10 413.25
14  6  8  9 10 521.25
15  7  8  9 10 511.50

$`2`
   X1 X2 X3   rt.avg
1   4  5  6 365.6667
2   4  5  7 295.3333
3   4  5  8 342.0000
4   4  5  9 405.3333
5   4  5 10 309.0000
6   4  6  7 348.3333
7   4  6  8 395.0000
8   4  6  9 458.3333
9   4  6 10 362.0000
10  4  7  8 324.6667
11  4  7  9 388.0000
12  4  7 10 291.6667
13  4  8  9 434.6667
14  4  8 10 338.3333
15  4  9 10 401.6667
16  5  6  7 276.6667
17  5  6  8 323.3333
18  5  6  9 386.6667
19  5  6 10 290.3333
20  5  7  8 253.0000
21  5  7  9 316.3333
22  5  7 10 220.0000
23  5  8  9 363.0000
24  5  8 10 266.6667
25  5  9 10 330.0000
26  6  7  8 306.0000
27  6  7  9 369.3333
28  6  7 10 273.0000
29  6  8  9 416.0000
30  6  8 10 319.6667
31  6  9 10 383.0000
32  7  8  9 345.6667
33  7  8 10 249.3333
34  7  9 10 312.6667
35  8  9 10 359.3333

$`3`
   X1 X2 rt.avg
1   3  4  396.0
2   3  5  379.5
3   3  6  384.0
4   3  7  318.5
5   3  8  374.0
6   3  9  351.5
7   3 10  402.5
8   4  5  372.5
9   4  6  377.0
10  4  7  311.5
11  4  8  367.0
12  4  9  344.5
13  4 10  395.5
14  5  6  360.5
15  5  7  295.0
16  5  8  350.5
17  5  9  328.0
18  5 10  379.0
19  6  7  299.5
20  6  8  355.0
21  6  9  332.5
22  6 10  383.5
23  7  8  289.5
24  7  9  267.0
25  7 10  318.0
26  8  9  322.5
27  8 10  373.5
28  9 10  351.0

答案 1 :(得分:2)

以下代码按subjlapply函数将数据集拆分到每个子集。函数fun使用combn来确定factor == "Late"时的索引组合,并计算由这些组合索引的每个rt的平均值。

fun <- function(DF){
  n <- sum(DF[["factor"]] == "Early")
  late <- which(DF[["factor"]] == "Late")
  cmb <- combn(late, n)
  apply(cmb, 2, function(i) mean(DF[i, "rt"]))
}

sp <- split(df1, df1$subj)
lapply(sp, fun)
#$`1`
# [1] 457.75 390.50 362.50 498.50 470.50 403.25 488.75
# [8] 460.75 393.50 501.50 508.50 480.50 413.25 521.25
#[15] 511.50
#
#$`2`
# [1] 365.6667 295.3333 342.0000 405.3333 309.0000 348.3333
# [7] 395.0000 458.3333 362.0000 324.6667 388.0000 291.6667
#[13] 434.6667 338.3333 401.6667 276.6667 323.3333 386.6667
#[19] 290.3333 253.0000 316.3333 220.0000 363.0000 266.6667
#[25] 330.0000 306.0000 369.3333 273.0000 416.0000 319.6667
#[31] 383.0000 345.6667 249.3333 312.6667 359.3333
#
#$`3`
# [1] 396.0 379.5 384.0 318.5 374.0 351.5 402.5 372.5 377.0
#[10] 311.5 367.0 344.5 395.5 360.5 295.0 350.5 328.0 379.0
#[19] 299.5 355.0 332.5 383.5 289.5 267.0 318.0 322.5 373.5
#[28] 351.0