我有一个数据集,我需要将一个变量(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)]
我希望这种结果的迂回方式不那么迂回。
答案 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
函数可以直接应用于此。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)