Используйте group_by, чтобы выбрать все предыдущие уровни группировки в dplyr - PullRequest
2 голосов
/ 06 марта 2019

Я работаю над реализацией процедуры последовательного тестирования, которая принимает значения для пользователей, разделенных на два разных условия каждый день, и вычисляет 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 я быиметь p-значение для всех значений для даты 1, для даты 2 у меня будет p-значение для всех значений для даты 1: 2 и т. д. Я не могу решить эту проблему с помощью dplyr.

Ответы [ 2 ]

3 голосов
/ 06 марта 2019

Мы можем узнать все даты 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

data

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 голос
/ 06 марта 2019

Если вы не привязаны к 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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...