我有一个看起来像这样的数据框
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()函数可以帮助组合部分,但是我真的不知道如何通过早期疾病的试验次数来定义组合的数量,因为每个参与者的情况都会有所不同。 >
我不知道我是否足够清楚,但我希望有人可以帮助遮挡一些光线。
谢谢大家!
答案 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)
以下代码按subj
和lapply
函数将数据集拆分到每个子集。函数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