如果NA的数量大于所有条目的50%,我想迭代数据框和每列的列,我想从数据框中删除该列。到目前为止,我有类似的东西,但它不起作用:
for (i in names(df_r)) {
if (sum(is.na(df_r[,i]))/length(df_r) > 0.5) {
df_r <- df_r[, -i]
}
}
我更像是一个蟒蛇人,我正在学习R所以我可能会在这里混合语法。
答案 0 :(得分:1)
使用更多基于矢量的计算更好的是更文字的for
循环。
na50 <- sapply(df_r, function(x) sum(is.na(x))) / nrow(df_r)
df_r[na50 > 0.5] <- NULL
# or
df_r <- df_r[na50 <= 0.5]
答案 1 :(得分:1)
我会使用lapply
遍历data.frame列:
DF <- data.frame(x = c(1, NA, 2), y = c("a", NA, NA))
DF[] <- lapply(DF, function(x) if (mean(is.na(x)) <= 0.5) x else NULL)
# x
#1 1
#2 NA
#3 2
答案 2 :(得分:1)
对于R中的循环通常不是很快并且应该避免。在这种情况下,您可以使用dplyr
使其变得快速而整洁:
library(dplyr)
df_r %>%
select_if(function(x) { ! sum(is.na(x)) / length(x) > 0.5 })
答案 3 :(得分:0)
检查一下:
## for loop solution
for(i in names(dt))
{
len <- nrow(dt)
if(sum(is.na(dt[[i]])) > (len/2)) dt[[i]] <- NULL
else next
}
## non for loop solution
cols <- colSums(is.na(dt))
cols <- names(cols[cols > (nrow(dt)/2)])
dt[[cols]] <- NULL
答案 4 :(得分:0)
基本上是一行:
df_r <- df_r[, apply(df_r, MARGIN = 2, FUN = function(x) sum(is.na(x))/length(x) <= 0.5)]
apply
将函数(在FUN =
之后指定)应用于每个列(由MARGIN = 2
指定)。该函数检查NA
s的比例是否小于或等于0.5并返回逻辑向量。然后,此向量仅选择df_r
比例较小的NA
列。