本周早些时候我提交了一篇类似的帖子(For loop vectorization),我非常感谢所提供的答案。目前的问题是关于data.table
包的使用及其循环群组的能力的跟进两个data.tables来执行特定的计算。
背景
我按照与之前相同的格式重新创建数据,并包含@jlhoward提供的答案。在此示例中,我有dt1
,其中包含按values
和group
分组的主题及其测量值(time
)。此外,dt2
只有一个主题的测量值恰好是具有某种已知状态的参考。
group_mean
功能在应用时,会按group
和time
循环显示每个主题的测量值,并将它们与{dt2
中参考主题的测量值进行比较1}}。然后p_value
将告诉我们测量值的方差在彼此之间有多么不同/相似。
> library(data.table)
> library(lawstat)
> dt1 <- data.table(group = factor(rep(LETTERS[1:3], c(20,20,20))),
+ time = factor(rep(1:5, 12)),
+ values = runif(60, min = 0, max = 1),
+ key = c("group", "time"))
> dt2 <- data.table(group = factor(rep(LETTERS[4], 15)),
+ values = runif(15, min = 0, max = 1),
+ key = "group")
#Provided by @jlhoward#
> group_mean <- function(values)
+ {
+ example <- data.table(group = rep(c("T", "C"), c(length(values), nrow(dt2))),
+ values = c(values, dt2$values))
+ with(example, levene.test(values, group)$p.value)
+ }
> dt1[, list(p_value = group_mean(values)), by = c("group", "time")]
group time p_value
1: A 1 0.009812081
2: A 2 0.840368463
3: A 3 0.883976812
4: A 4 0.961928210
5: A 5 0.132638244
6: B 1 0.637280622
7: B 2 0.867169067
8: B 3 0.702991461
9: B 4 0.899523194
10: B 5 0.570103537
11: C 1 0.100202309
12: C 2 0.287019659
13: C 3 0.617098238
14: C 4 0.069866914
15: C 5 0.103481549
问题:
可能存在确定其他主题的状态并且其测量值因此被添加到dt2
的时间点(由dt3
的以下代码表示。)
> dt3 <- data.table(group = factor(rep(LETTERS[4:6], c(15,15,15))),
+ values = c(dt2$values, runif(30, min = 0, max = 1)),
+ key = "group")
问题:
如何修改group_mean
函数,以便对dt1
中的每个主题(group
和time
)之间的测量值执行此差异测试和dt3
中的每个主题(group
)?
虽然我希望使用dt3
循环对来自for
的每个主题进行分组,但我试图更好地理解data.table
及其语法。下面是p_value
故意留空的所需输出示例。
group time ref_group p_value
1: A 1 D
2: A 2 D
3: A 3 D
4: A 4 D
5: A 5 D
6: A 1 E
7: A 2 E
8: A 3 E
9: A 4 E
10: A 5 E
11: A 1 F
12: A 2 F
13: A 3 F
14: A 4 F
15: A 5 F
16: B 1 D
17: B 2 D
18: B 3 D
19: B 4 D
20: B 5 D
21: B 1 E
22: B 2 E
23: B 3 E
24: B 4 E
25: B 5 E
26: B 1 F
27: B 2 F
28: B 3 F
29: B 4 F
30: B 5 F
31: C 1 D
32: C 2 D
33: C 3 D
34: C 4 D
35: C 5 D
36: C 1 E
37: C 2 E
38: C 3 E
39: C 4 E
40: C 5 E
41: C 1 F
42: C 2 F
43: C 3 F
44: C 4 F
45: C 5 F
与往常一样,感谢您的时间和意见。