使用group_by选择dplyr中所有以前的分组级别

时间:2019-03-06 10:00:40

标签: r dplyr

我正在实施一个顺序测试程序,该程序每天将用户的值分成两个不同的条件,并从该样本中计算出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解决这个问题。

2 个答案:

答案 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))