`summarise_each_()` устарел с версии dplyr 0.7.0. Пожалуйста, используйте `across()` вместо этого. Проблема с `summarise()` вводом `..1`

#r #tidyverse

#r #tidyverse

Вопрос:

У меня есть это, и это работает:

 data %>%
        select_if(function(x) any(is.na(x))) %>% 
        summarise_each(funs(sum(is.na(.))))
  

Предупреждающее сообщение:
summarise_each() устарел с версии dplyr 0.7.0.
Пожалуйста, используйте across() вместо этого.

Когда я изменяю sumarise_each():

 data %>%
        select_if(function(x) any(is.na(x))) %>% 
        summarise(across(funs(sum(is.na(.)))))
  

Это произойдет:

Ошибка: проблема с summarise() вводом ..1 .
x должен подмножествовать столбцы с допустимым вектором индекса.
Индекс x имеет неправильный тип fun_list .
ℹ Оно должно быть числовым или символьным.
ℹ Ввод ..1 across(funs(sum(is.na(.)))) .

Я хочу обновить свой код с помощью функции across .

Комментарии:

1. Вы, вероятно, получите лучший ответ, если предоставите воспроизводимый пример данных, с которыми вы работаете, и то, как вы хотите, чтобы выглядел ваш ожидаемый результат. Первое, на что вы захотите обратить внимание, это ожидаемый порядок аргументов summarise(across()) . Первым аргументом across должны быть столбцы, к которым вы хотите применить функцию (ы). Не видя ваших данных или не понимая, что вы пытаетесь сделать, будет сложно что-то посоветовать помимо этого. Вы пытаетесь выбрать все столбцы, в которых есть хотя бы 1 NA?

Ответ №1:

Для этого есть другой способ:

 library(dplyr)
df %>%
  summarize(across(where(~any(is.na(.)), ~sum(is.na(.)))) 

starwars %>% 
  summarise(across(where(~any(is.na(.))), ~sum(is.na(.))))

 height  mass hair_color birth_year   sex gender homeworld species
   <int> <int>      <int>      <int> <int>  <int>     <int>   <int>
1      6    28          5         44     4      4        10       4
  

Вам больше не нужен select_if with across() . where() Внутренняя across() часть позволяет вам выполнить логическую проверку. Затем вы предоставляете функцию суммирования. ~ Обозначение позволяет вам выполнять функцию, которая ссылается обратно на данные, где точка ссылается на данные в столбце eahc.

Ответ №2:

Вот что, я думаю, вы пытаетесь сделать

     library(dplyr)
    df <- data.frame(id=c("001","002"), A = c(0,0), B= c(NA,0), C=c(NA,1))
    df

         id  A  B  C
1        001 0 NA NA
2        002 0  0  1


    df %>%
    select(where(function(x) any(is.na(x)))) %>%
    rowwise %>%
    mutate(sumNA = sum(is.na(c_across(everything()))))

    # A tibble: 2 x 3
    # Rowwise: 
       B      C    sumNA
     <dbl>  <dbl>  <int>
  1    NA    NA     2
  2    0     1      0
  

При этом выбираются все столбцы, содержащие NA, а затем добавляется новый столбец, который показывает, сколько NA в каждой строке