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
中,我们可以使用Reduce
和is.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
我觉得我应该可以使用过滤器或子集来做到这一点,但不知道如何做。
如果某行中有三个或更多单元格为“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
中,我们可以使用Reduce
和is.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