如果NA中有太多NA,请删除R中的列[关闭]

问题描述 投票:0回答:2

我想编写一些代码来检查列中是否包含NA值,以及如果它优于某个值,那么该列将从另一个选项卡中删除。

我现在有这个:

tab2=tab

for(i in 1:145){

  x=sum(is.na(tab[,i]))
  print(x)

  if(x>10550/2) {

  tab2 <- tab[,-i]

  }
  x=0
}

我的数据集由145列组成,我知道至少应该删除一半,但这段代码只删除一列,就像循环执行一次一样。我已经尝试了几个但没有工作。有任何想法吗 ?

r missing-data
2个回答
1
投票

我认为一个比循环更有用的方法是使用colSums(is.na(.))来获得每列的NA数,然后应用你的逻辑条件。然后,我们可以使用该逻辑运算的输出来执行列子集以获得所需的输出。

tab[, colSums(is.na(tab)) <= 10500/2]

0
投票

使用tidyverse方法:

library(tidyverse)
data_used <- data.frame(month = c(1:5), 
                 var0 = c(1,2,5,6,8),
                 Var1 = c(rep(NA,3),1,1),
                 Var2 = c(rep(NA,3),3,2),
                 Var3 = c(rep(NA,2),5,3,2))
new_data <- data_used %>% 
    select_if(.predicate=funs(sum(is.na(.))<=2))
© www.soinside.com 2019 - 2024. All rights reserved.