R中两个data.tables之间按组计算

时间:2014-10-09 17:07:49

标签: r data.table subset

本周早些时候我提交了一篇类似的帖子(For loop vectorization),我非常感谢所提供的答案。目前的问题是关于data.table包的使用及其循环群组的能力的跟进两个data.tables来执行特定的计算。

背景

我按照与之前相同的格式重新创建数据,并包含@jlhoward提供的答案。在此示例中,我有dt1,其中包含按valuesgroup分组的主题及其测量值(time)。此外,dt2只有一个主题的测量值恰好是具有某种已知状态的参考。

group_mean功能在应用时,会按grouptime循环显示每个主题的测量值,并将它们与{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中的每个主题(grouptime)之间的测量值执行此差异测试和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   

与往常一样,感谢您的时间和意见。

0 个答案:

没有答案