删除具有完整 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
中使用许多不同的选择语句。查看文档以获取更多示例。
我有一个数据集,我想删除列 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
中使用许多不同的选择语句。查看文档以获取更多示例。