Вытащить имена переменных с порогом пропущенных значений - PullRequest
0 голосов
/ 30 мая 2018

Я работаю с набором данных, содержащим 93 столбца, и многие из них имеют большой процент пропущенных значений.Я ищу способ упростить проверку каждого столбца на процент пропущенных значений и затем вернуть список имен этих переменных выше этого порога для включения в новый набор данных.

У меня есть функция для проверкидля пропущенных значений и вернуть процент пропущенных:

#check for missing data
pMiss <- function(x) {
  sum(is.na(x))/length(x)*100
}

#percent of data missing per column
x <- apply(dt2,2,pMiss)

Как я могу получить все имена [из x] столбцов, где процент пропущенных значений составляет менее 20%?Я хотел бы получить эти имена в виде списка, который я могу вставить в новый набор данных, поэтому мне не нужно вручную копировать и вставлять каждое имя из x.

Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 30 мая 2018
df <- data.frame(a=c(NA,NA,1,1),b=c(NA,1,1,1),c=c(1,1,1,1))
x <- colMeans(is.na(df))
# a    b    c 
# 0.50 0.25 0.00

x[x < .3]
# b    c 
# 0.25 0.00

names(x[x < .3])
# [1] "b" "c"

или все в одной строке:

names(df)[colMeans(is.na(df)) < .3]
# [1] "b" "c"
0 голосов
/ 30 мая 2018

Вы можете использовать подход tidyverse:

require(tidyverse)
set.seed(123)
dat <- data.frame(a=sample(c(1,2,NA), size=20, replace=TRUE), 
                  b=sample(c(1,2,NA), size=20, replace=TRUE), 
                  c=sample(c(1:10,NA), size=20, replace=TRUE))

threshold <- .43 

dat %>% 
  gather(var, value) %>% 
  group_by(var) %>% 
  summarise(prep.missing = sum(is.na(value)) / n()) %>% 
  filter(prep.missing < threshold)

  var   prep.missing
  <chr>        <dbl>
1 a            0.400
2 c            0. 
0 голосов
/ 30 мая 2018

Это будет работать:

# example dataset
set.seed(123)
dat <- data.frame(a=sample(c(1,2,NA), size=20, replace=TRUE), 
                  b=sample(c(1,2,NA), size=20, replace=TRUE), 
                  c=sample(c(1:10,NA), size=20, replace=TRUE))

threshold <- .25 # for example

# get subset of colnames s.t. NA proportion is greater than threshold
names(dat)[sapply(dat, function(x) mean(is.na(x)) > threshold)]
## [1] "a" "b"
...