比较data.table列中的组

时间:2016-02-11 12:36:38

标签: r data.table grouping

我有一个数据集,我需要将一个变量(Day)拆分,然后在另一个变量(Group)的组之间进行比较,执行每组统计(例如{{1}并且还测试。

以下是我设计的一个例子:

mean

产生:

require(data.table)
data = data.table(Day = rep(1:10, each = 10), 
                  Group = rep(1:2, times = 50),
                  V = rnorm(100))

data[, .(g1_mean = mean(.SD[Group == 1]$V),
         g2_mean = mean(.SD[Group == 2]$V),
         p.value = t.test(V ~ Group, .SD, alternative = "two.sided")$p.value),
     by = list(Day)]

我希望这种结果的迂回方式不那么迂回。

2 个答案:

答案 0 :(得分:2)

可能的紧凑替代方案,也可以为每个组应用更多功能:

DTnew <- dcast(DT[, pval := t.test(V ~ Group, .SD, alternative = "two.sided")$p.value, Day],
               Day + pval ~ paste0("g",Group), fun = list(mean,sd), value.var = "V")

给出:

> DTnew
    Day      pval   V_mean_g1    V_mean_g2   V_sd_g1   V_sd_g2
 1:   1 0.4763594 -0.11630634  0.178240714 0.7462975 0.4516087
 2:   2 0.5715001 -0.29689807  0.082970631 1.3614177 0.2745783
 3:   3 0.2295251 -0.48792449 -0.031328749 0.3723247 0.6703694
 4:   4 0.5565573  0.33982242  0.080169698 0.5635136 0.7560959
 5:   5 0.5498684 -0.07554433  0.308661427 0.9343230 1.0100788
 6:   6 0.4814518  0.57694034  0.885968245 0.6457926 0.6773873
 7:   7 0.8053066  0.29845913  0.116217727 0.9541060 1.2782210
 8:   8 0.3549573  0.14827289 -0.319017581 0.5328734 0.9036501
 9:   9 0.7290625 -0.21589411 -0.005785092 0.9639758 0.8859461
10:  10 0.9899833  0.84034529  0.850429982 0.6645952 1.5809149

代码分解

  • 首先,使用pval
  • DT[, pval := t.test(V ~ Group, .SD, alternative = "two.sided")$p.value, Day]变量添加到数据集中
  • 由于DT已就地更新并通过上一步的引用,dcast函数可以直接应用于此。
  • 在投射公式中,您指定需要保留在RHS上当前表单中的变量以及需要在LHS上的列上展开的变量。
  • 使用fun参数,您可以指定必须在value.var(此处为V)上使用哪个聚合函数。如果需要多个聚合函数,您可以在列表中指定它们(例如list(mean,sd))。这可以是任何类型的功能。所以,也可以使用cumstom制作的功能。

如果要从列名中删除V_,可以执行以下操作:

names(DTnew) <- gsub("V_","",names(DTnew))

注意:我将data.table重命名为DT,因为在函数后命名数据集通常不明智(检查?data

答案 1 :(得分:1)

虽然不是单行,但您可以考虑将两个流程分开,然后合并结果。这可以防止您必须对组名进行硬编码。

首先,我们计算方法:

my_means <- dcast(data[,mean(V), by = .(Day, Group)],
                  Day~ paste0("Mean_Group", Group),value.var="V1")

或者@Akrun在评论中提到的不那么复杂的方式,添加了一些格式。

my_means <- dcast(Day~paste0("Mean_Group", Group), data=data,
              fun.agg=mean, value.var="V")

然后是t检验:

t_tests <- data[,.(p_value=t.test(V~Group)$p.value), by = Day]

然后合并:

output <- merge(my_means, t_tests)