拉出具有缺失值阈值的变量名称

时间:2018-05-29 22:10:11

标签: r function missing-data

我正在使用包含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)

如何从缺失值百分比小于20%的列中检索[来自x]的所有名称?我想将这些名称检索为可以粘贴到新数据集中的列表,因此我不必手动复制并粘贴x中的每个名称。

提前谢谢。

3 个答案:

答案 0 :(得分:1)

这个工作:

# 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"

答案 1 :(得分:1)

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"

答案 2 :(得分:1)

您可以使用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.