对于R中的循环列

时间:2018-02-27 10:09:35

标签: r for-loop dataframe

如果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所以我可能会在这里混合语法。

5 个答案:

答案 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列。