Внутри вложенного фрейма данных отфильтруйте строки, содержащие определенные строки - PullRequest
0 голосов
/ 23 мая 2018

Я использую вложенные фреймы данных для вложения по определенным группам, а затем запускаю t-тесты для факторов и значений в столбце $ data.Однако для некоторых условий в столбце $ data у меня нет двух доступных факторов.Таким образом, t-тест не может быть запущен, и код выдаст ошибку для всего фрейма данных.В приведенном ниже примере для групп a - d будут доступны оба метода лечения для сравнения.Тем не менее, группа е не будет.как я могу указать, что t-тест должен выполняться только в тех строках, где доступны обе обработки?

set.seed(1)
df <- data.frame(id = paste0('ID-', 1:100),
                 group = rep(c('a', 'b', 'c', 'd', 'e'), each = 20),
                 treatment = c(rep(c('x', 'y'), 40), rep('x', 20)),
                 value = runif(100))

df_analysis <- df %>% 
  nest(-group) %>% 
  #How to ask to only run t test on rows that have both treatments in them? As written, it will give an error.
  mutate(p = map_dbl(data, ~t.test(value ~ treatment, data=.)$p.value))

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Поскольку вы уже используете некоторые пакеты tidyverse, вы можете использовать некоторые функции мурлыканья для захвата побочных эффектов.В этом случае вы можете использовать possibly, который использует значение по умолчанию при возникновении ошибки.

используя ваш код:

library(dplyr)
library(purrr)
library(tidyr)

set.seed(1)
df <- data_frame(id = paste0('ID-', 1:100),
                 group = rep(c('a', 'b', 'c', 'd', 'e'), each = 20),
                 treatment = c(rep(c('x', 'y'), 40), rep('x', 20)),
                 value = runif(100))

df_analysis  <- df %>% 
  nest(-group) %>% 
  mutate(p = map_dbl(data, possibly(~t.test(value ~ treatment, data=.)$p.value, NA_real_)))

# A tibble: 5 x 3
  group data                   p
  <chr> <list>             <dbl>
1 a     <tibble [20 x 3]>  0.610
2 b     <tibble [20 x 3]>  0.156
3 c     <tibble [20 x 3]>  0.840
4 d     <tibble [20 x 3]>  0.383
5 e     <tibble [20 x 3]> NA    
0 голосов
/ 23 мая 2018

Оберните t.test(...) в ifelse(), проверяя, что количество уникальных предметов в treatment равно ==2

df %>% 
  nest(-group) %>% 
  mutate(p = map_dbl(data, ~ifelse(length(unique(.x$treatment)) == 2, t.test(value ~ treatment, data=.)$p.value, NA)))

# A tibble: 5 x 3
  # group data                        p
  # <fct> <list>                  <dbl>
# 1 a     <data.frame [20 x 3]>  0.790 
# 2 b     <data.frame [20 x 3]>  0.0300
# 3 c     <data.frame [20 x 3]>  0.712 
# 4 d     <data.frame [20 x 3]>  0.662 
# 5 e     <data.frame [20 x 3]> NA 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...