R中的For循环和if语句

时间:2018-11-21 21:46:41

标签: r

我有一个数据框orange_train,它具有231个变量和50,000个观察值。我想检查每个变量的NA或零。如果NA(对于因子)和零(对于数字和整数)的总和大于50,000的75%,我想消除这些变量。我的代码如下:但是它无法正常工作:

counting_na <- function(x) {sum(is.na(x))}
counting_zero <- function(x){length(which(x==0))}

for(i in 1:ncol(orange_train)){
  if (class(orange_train$Var[i])=='numeric' && sum(is.na(orange_train$Var[i]))< 32500) 
    {print(orange_train$Var[i])}
  else (class(orange_train$Var[i])=='integer' && [enter image description here][1]counting_zero(orange_train$Var[i]) < 32500)
  {print(orange_train$Var[i])}

有人可以帮助我提供代码。我已经挣扎了很长时间,对R还是很陌生。

我的列的标题为Var1-Var231,数据类型为数字,因子和整数。希望对您有帮助

1 个答案:

答案 0 :(得分:1)

示例数据

set.seed(10)

df <- data.frame(a = sample(c(NA, LETTERS[1]), 100, T, prob = c(.75, .25))
                 , b = sample(0:1, 100, T, prob = c(.75, .25))) 

计算每列的百分比(因子为NA的百分比,数字为0的百分比)

percents <- 
  sapply(df, function(x){
    if(is.factor(x)) mean(is.na(x)) 
    else if(is.numeric(x)) mean(x == 0) 
    else NA})

percents
#    a    b 
# 0.84 0.75 

删除大于75%的内容

df[percents > 0.75] <- NULL

names(df)
#[1] "b"

您会看到a列已被删除,因为它是84%NA s的一个因素