R 如果三个或更多值是 NA,则删除行

R Removing row if three or more values are NA

我觉得我应该可以使用过滤器或子集来做到这一点,但不知道如何做。

如果某行中有三个或更多单元格为“NA”,我该如何删除该行?

所以在这个数据集中,标题为 1A-C2 和 3A-C2 的行将被删除。

my_data <- data.frame(Title = c("1A-C2", "1D-T2", "1F-T1", "1E-C2", "3A-C2", "3F-T2"),
                      Group1 = c(NA, 10, 2, 9, NA, 4), Group2 = c(1, 3, 6, 1, NA, 3), Group3=c(NA, 3, 3, 8, NA, 4), Group4=c(NA, NA, 4, 5, 1, 7), Group5=c(1, 4, 3, 3, 9, NA), Group6=c(NA, 4, 5, 6, 1, NA))

谢谢!!

Base R,

  my_data[rowSums(is.na(my_data))<3,]

给予,

  Title Group1 Group2 Group3 Group4 Group5 Group6
2 1D-T2     10      3      3     NA      4      4
3 1F-T1      2      6      3      4      3      5
4 1E-C2      9      1      8      5      3      6
6 3F-T2      4      3      4      7     NA     NA

使用dplyr

library(dplyr)

my_data %>%
  rowwise() %>%
  filter(sum(is.na(c_across(starts_with('Group')))) < 3)

#  Title Group1 Group2 Group3 Group4 Group5 Group6
#  <chr>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>
#1 1D-T2     10      3      3     NA      4      4
#2 1F-T1      2      6      3      4      3      5
#3 1E-C2      9      1      8      5      3      6
#4 3F-T2      4      3      4      7     NA     NA

base R中,我们可以使用Reduceis.na

subset(my_data, Reduce(`+`, lapply(my_data[startsWith(names(my_data), "Group")],
       is.na)) < 3)
#  Title Group1 Group2 Group3 Group4 Group5 Group6
#2 1D-T2     10      3      3     NA      4      4
#3 1F-T1      2      6      3      4      3      5
#4 1E-C2      9      1      8      5      3      6
#6 3F-T2      4      3      4      7     NA     NA