выбрать столбцы на основе условия диапазона и содержащие также значения NA - PullRequest
0 голосов
/ 05 января 2020

На основании моего вопроса здесь

У меня есть набор данных: я хочу, чтобы столбцы основывались на диапазоне значений: все значения подмножественных столбцов должны быть в диапазоне от 99 до 1000.

 var1 <- c(333, NA, 456)
 var2 <- c(3, 10, 500)
 var3 <- c(356, 813, 856)
 var4 <- c("aaa", "bbb", "ccc")
 var5 <- c(NA, 111, 989)

dataset <- data.frame(var1, var2, var3, var4, var5)

Хорошо работает без значений NA

dataset %>%
select_if(~ is.numeric(.) && all(between(., 99, 1000)))

или

purrr::keep(dataset, ~is.numeric(.) && min(.) >= 99 && max(.) <= 1000)

, но когда я ввожу NA в мои данные:

select_if функция возвращает мне эту ошибку:
«Только символы могут быть преобразованы в символы»

puur::keep функция возвращает мне эту ошибку: «Функции предиката должны возвращать один TRUE или FALSE, а не пропущенные значение "

Как мне управлять NA? Выберите столбцы на основе диапазона значений, содержащих значения Alos NA?

Ответы [ 3 ]

3 голосов
/ 05 января 2020

Я думаю, что это должно решить эту проблему

var1 <- c(333, NA, 456)
var2 <- c(3, 10, 500)
var3 <- c(356, 813, 856)
var4 <- c("aaa", "bbb", "ccc")
var5 <- c(NA, 111, 989)

dataset <- data.frame(var1, var2, var3, var4, var5)

purrr::keep(dataset, ~is.numeric(.) && min(.,na.rm = TRUE) >= 99 && max(.,na.rm = TRUE) <= 1000)
#>   var1 var3 var5
#> 1  333  356   NA
#> 2   NA  813  111
#> 3  456  856  989

Создано в 2020-01-05 пакетом представитель (v0.3.0)

1 голос
/ 05 января 2020

Вы можете использовать findInterval() с базы.

dataset[colMeans(sapply(dataset, findInterval, c(99, 1000)), na.rm=T) == 1]
#   var1 var3 var5
# 1  333  356   NA
# 2   NA  813  111
# 3  456  856  989
1 голос
/ 05 января 2020

Поскольку between не имеет параметра na.rm, вы можете изменить select_if, например:

library(dplyr)
dataset %>% select_if(~ is.numeric(.) && all(between(., 99, 1000) | is.na(.)))

#  var1 var3 var5
#1  333  356   NA
#2   NA  813  111
#3  456  856  989
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...