tidyverse - фильтрация во вложенном столбце / списке по количеству NA в строке - PullRequest
1 голос
/ 18 февраля 2020

Пытаясь расширить свой собственный рабочий процесс (из столбцов) здесь: [1] tidyverse - удалить столбец во вложенном столбце / списке для фильтрации во вложенном столбце / списке, я нашел это потенциальное решение: [2] Использовать filter () (и другие функции dplyr) внутри вложенных фреймов данных с map ()

Моя проблема в том, что я хочу фильтровать в каждом "гнезде" на те строки, которые не являются полностью NA (т.е. я хочу сохранить любую строку, которая имеет хотя бы одно не пропущенное значение .

Однако, простое решение в [2] не работает для меня, вероятно, потому что я хочу отфильтровать сумму NA в строке, что может включать в себя другую функцию карты внутри фильтра.

(Примечание: я использую текущую версию dplyr для github в tidyverse, которая предлагает некоторые новые экспериментальные функции, такие как конденсат - который я использую ниже, но я думаю, что это не относится к моей проблеме / вопросу).

У меня есть следующие данные:

Данные:

library(tidyverse)
library(corrr)

dat <- data.frame(grp = rep(1:4, each = 25),
                  Q1 = sample(c(1:5, NA), 100, replace = TRUE),
                  Q2 = sample(c(1:5, NA), 100, replace = TRUE),
                  Q3 = sample(c(1:5, NA), 100, replace = TRUE),
                  Q4 = sample(c(1:5, NA), 100, replace = TRUE),
                  Q5 = sample(c(NA), 100, replace = TRUE),
                  Q6 = sample(c(1:5, NA), 100, replace = TRUE))

Я сейчас вычислю кор отношения Q1 к Q6 для каждой группы и удалите столбец rowname.

cor_dat <- dat %>%
  group_by(grp) %>%
  condense(cor = correlate(cur_data()) %>%
         select(-rowname)) %>%
  ungroup()

Но добавление этой строки в мой конвейер не работает:

cor_dat <- cor_dat %>%
  mutate(cor = map(cor, ~ filter(., sum(is.na(.)) != ncol(.))))

Я тоже пробовал, но это также не работает:

cor_dat <- cor_dat %>%
      mutate(cor = map(cor, ~ filter(., !all(is.na(.)))))

Ожидаемый результат в моих данных будет, что пятая строка в каждом гнезде отфильтрованы.

1 Ответ

2 голосов
/ 18 февраля 2020

Здесь мы можем использовать filter_all

library(dplyr)
library(purrr)
cor_dat <- cor_dat %>% 
               mutate(cor = map(cor, ~ .x %>% 
                              filter_all(any_vars(!is.na(.)))))
cor_dat
# A tibble: 4 x 2
#    grp cor             
#  <int> <list>          
#1     1 <tibble [5 × 6]>
#2     2 <tibble [5 × 6]>
#3     3 <tibble [5 × 6]>
#4     4 <tibble [5 × 6]>

cor_dat$cor[[1]]
# A tibble: 5 x 6
#       Q1      Q2      Q3      Q4    Q5      Q6
#    <dbl>   <dbl>   <dbl>   <dbl> <dbl>   <dbl>
#1 NA      -0.226   0.288  -0.0536    NA  0.581 
#2 -0.226  NA      -0.382   0.212     NA  0.0274
#3  0.288  -0.382  NA      -0.0772    NA -0.153 
#4 -0.0536  0.212  -0.0772 NA         NA  0.0831
#5  0.581   0.0274 -0.153   0.0831    NA NA     

Или, если нам нужно использовать filter, тогда создайте лог c с rowSums

cor_dat %>%
       mutate(cor = map(cor, ~ .x %>%
                                  filter(rowSums(is.na(.)) < ncol(.))))

данные

cor_dat <- dat %>%
   group_by(grp) %>%
   condense(cor = correlate(cur_data()) %>% 
                 select(-rowname)) %>% 
   ungroup 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...