删除超过50%零的列以及超过25%“na”的列

时间:2018-03-15 20:45:06

标签: r

我需要删除超过50%的零的列以及超过25%的na的列。我尝试使用clean函数首先删除read.csv(...., na.string="na")中的na。然后我使用write.csv并尝试使用read.csv为新数据文件使用read.csv(...., na.string="0")再次使用clean函数,但出现错误

  

错误:此数据集不需要清理。

有没有办法为零和NA使用apply和执行函数?

对不起,我是R的新手。

2 个答案:

答案 0 :(得分:0)

您可以使用sapply直接返回具有>=50%有效(即非空和非NA)条目的列的索引。由于您没有提供任何样本数据集,因此我生成了一个样本data.frame

# Sample data
set.seed(2017);
x <- sample(20);
x[sample(1:20, 5)] <- NA;
x[sample(1:20, 5)] <- 0;
df <- as.data.frame(matrix(x, ncol = 4));
df;
#  V1 V2 V3 V4
#1 19  0  7  2
#2  0  1  0 NA
#3  9 NA NA 15
#4 NA 16 20  0
#5  0  4  3 NA

# 50% threshold
thresh <- 0.50;
df[, sapply(df, function(x) length(x[!(is.na(x) | x == 0)]) / length(x) >= 0.5)];
#  V2 V3
#1  0  7
#2  1  0
#3 NA NA
#4 16 20
#5  4  3

说明:x[!(is.na(x) | x == 0)]选择非空和非NA的列条目;然后我们计算非零和&amp;的分数。每列所有条目中的非NA条目,以及具有分数>=0.5的那些列的返回索引。

答案 1 :(得分:0)

数据

set.seed(1);
df <- as.data.frame(matrix(sample(c(1,1,0,NA),42,T), ncol = 6));
#   V1 V2 V3 V4 V5 V6
# 1  1  0 NA  1 NA  0
# 2  1  0  1  0  1 NA
# 3  0  1  0  1  1  1
# 4 NA  1 NA  1  0  0
# 5  1  1  1  1  1  1
# 6 NA  0 NA  1  1 NA
# 7 NA  1 NA  1 NA  0

<强>溶液

df[,colSums(df==0,na.rm = T)/nrow(df) < 0.25 & colSums(is.na(df))/nrow(df) < 0.5]

#   V2 V4 V5 V6
# 1  0  1  1  1
# 2  1  0 NA NA
# 3 NA  1  1 NA
# 4  1  1  1  1
# 5  1 NA  1  0
# 6  1  1 NA  1
# 7  1 NA NA  1