删除具有完整 NA 集的行

remove Rows with complete set of NA

我有一个数据集,我想删除列 456:555 中具有完整 NA 集的行,我想保留具有一些 NA 的行,但我需要删除具有完整集的行NA

我试过了

final[complete.cases(final[ , 456:555]),]

但这不起作用。它说

Error in help.search(c("[", "final", "complete.cases(final[, c(456:555)])",  : argument ‘pattern’ must be a single character string

那么我认为这可能会起作用:

data[rowSums(is.na(data)) != ncol(data),]

但我不知道在哪里包含 456:555

我该怎么办?

谢谢!

也许你可以这样做,但不是最干净的方法:



# data frame with one row complete NA
df <- data.frame(V1 = c(NA, 3, NA, 2, 3),
                 V2 = c(NA, 3, 1, NA, 5),
                 V3 = c(NA, NA, NA ,NA, NA))

df

V1 V2 V3
1 NA NA NA
2  3  3 NA
3 NA  1 NA
4  2 NA NA
5  3  5 NA



old_df <- df[4:5,] # get rows you wanna keep regardless of number of NAs
new_df <- df[1:3,] # get rows where you wanna delete complete NAs

# "delete" complete NAs
new_df <-  new_df %>% 
    filter(is.na(new_df) %>% rowSums() != length(new_df))

# build the two dfs together
df <-rbind(old_df, new_df)
df

V1 V2 V3
4  2 NA NA
5  3  5 NA
1  3  3 NA
2 NA  1 NA

这是一个使用 sjmisc 包的简单解决方案:

df[!apply(df[456:555],1,sjmisc::all_na),]

要检查它是否按照您的要求执行,请找一个小 reprex:

REPREX

df <- data.frame(V1 = c(NA, 3, NA, 2, 3),
                 V2 = c(NA, 3, 1, NA, 5),
                 V3 = c(NA, NA, NA ,NA, NA))

df
#>   V1 V2 V3
#> 1 NA NA NA
#> 2  3  3 NA
#> 3 NA  1 NA
#> 4  2 NA NA
#> 5  3  5 NA

# Select all line except `all_na` lines for the selected columns:
df[!apply(df[2:3],1,sjmisc::all_na),]
#>   V1 V2 V3
#> 2  3  3 NA
#> 3 NA  1 NA
#> 5  3  5 NA

reprex package (v2.0.1)

于 2021-10-11 创建

我们可以使用dplyr。以@lovalery 为例:

library(dplyr)

df %>% filter(!if_all(V2:V3, is.na))

#>   V1 V2 V3
#> 1  3  3 NA
#> 2 NA  1 NA
#> 3  3  5 NA

我们可以在 if_all 中使用许多不同的选择语句。查看文档以获取更多示例。