我需要删除超过50%的零的列以及超过25%的na的列。我尝试使用clean函数首先删除read.csv(...., na.string="na")
中的na。然后我使用write.csv
并尝试使用read.csv
为新数据文件使用read.csv(...., na.string="0")
再次使用clean函数,但出现错误
错误:此数据集不需要清理。
有没有办法为零和NA
使用apply和执行函数?
对不起,我是R的新手。
答案 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