我正在实施一个顺序测试程序,该程序每天将用户的值分成两个不同的条件,并从该样本中计算出t检验(p.value)。
df <- data.frame(
date = rep(1:3,each=30),
condition = sample(1:2,90,rep=T),
value = rnorm(90,5,5)
)
df %>% group_by(date) %>% summarise(test_out = t.test(value~condition)$p.value)
每天输出测试结果。但是,我的目标是在汇总输出时取所有以前的日期,以便测试结果代表到目前为止收集到的所有数据(向量在每个分组中都在增长)。
因此,在这种情况下,对于日期1,对于日期1,我将对所有值具有p值;对于日期2,对于日期1:2,我将对所有值具有p值,等等。我无法用dplyr解决这个问题。
答案 0 :(得分:3)
我们可以找出所有unique
个日期,并在每次迭代中向具有这些日期的数据帧filter
添加一个日期,然后计算p值。我们可以使用map_dfr
获得最终输出作为数据帧。
library(tidyverse)
vals <- unique(df$date)
map_dfr(seq_along(vals),~
df %>%
filter(date %in% vals[1:.x]) %>%
summarise(date = .x, test_out = t.test(value~condition)$p.value))
# date test_out
#1 1 0.00595657
#2 2 0.18614978
#3 3 0.13357542
我们可以手动交叉检查上述值
df %>% filter(date %in% 1) %>% summarise(test_out = t.test(value~condition)$p.value)
# test_out
#1 0.00595657
df %>% filter(date %in% c(1, 2)) %>% summarise(test_out = t.test(value~condition)$p.value)
# test_out
#1 0.1861498
df %>% filter(date %in% c(1, 2, 3)) %>% summarise(test_out = t.test(value~condition)$p.value)
# test_out
#1 0.1335754
数据
set.seed(123)
df <- data.frame(
date = rep(1:3,each=30),
condition = sample(1:2,90,rep=T),
value = rnorm(90,5,5)
)
答案 1 :(得分:1)
如果您不受dplyr
的束缚,则可以先创建一个子集列表,然后在其上运行sapply()
。
subs <- lapply(mapply(":", 1, 1:3), function(x) df[df$date %in% x, ])
sapply(subs, function(x) with(x, t.test(value ~ condition)$p.value))
# [1] 0.00595657 0.18614978 0.13357542
数据
set.seed(123)
df <- data.frame(date=rep(1:3, each=30),
condition=sample(1:2, 90, rep=TRUE),
value=rnorm(90, 5, 5))