#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 в каждой строке