我正在使用包含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中的每个名称。
提前谢谢。
答案 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.