当其中有太多 NA 时,删除 R 中的一列
Remove a column in R when there's too many NA in it
我想编写一些代码来检查列中是否有 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 列组成,我知道至少应该删除其中的一半,但这段代码只删除一列,就好像循环本身执行一次一样。我已经尝试了几个 thnigs 但没有工作。有什么想法吗?
我认为比循环更有用的方法是使用 colSums(is.na(.))
获取每列的 NA 数,然后应用您的逻辑条件。然后我们可以使用该逻辑操作的输出来执行列子集以获得所需的输出。
tab[, colSums(is.na(tab)) <= 10500/2]
使用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))
我想编写一些代码来检查列中是否有 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 列组成,我知道至少应该删除其中的一半,但这段代码只删除一列,就好像循环本身执行一次一样。我已经尝试了几个 thnigs 但没有工作。有什么想法吗?
我认为比循环更有用的方法是使用 colSums(is.na(.))
获取每列的 NA 数,然后应用您的逻辑条件。然后我们可以使用该逻辑操作的输出来执行列子集以获得所需的输出。
tab[, colSums(is.na(tab)) <= 10500/2]
使用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))