完全删除 r 中的 NA 行
Remove completely NA rows in r
一直在搜索这个,尽管它应该很简单,但我只找到了完整案例的解决方案或选择列的子集然后省略它们的 NA。在我的例子中,我有一个这样的数据框:
vp01ob__0 vp01ob__1 vp01ob__2 vp01ob__3 vp01ob__4 vp01ob__5 vp01ob__6 vp01ob__7 vp01ob__8
<chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
1 NA NA NA NA NA NA NA NA NA
2 NA NA NA NA NA NA NA NA NA
3 a NA NA NA NA NA NA NA NA
4 NA NA NA NA NA NA NA NA NA
5 NA NA NA NA NA NA NA NA NA
6 NA NA NA NA NA NA NA NA NA
7 NA b NA NA NA NA NA NA NA
这是一个非常稀疏的数据框,所以我只想保留包含一些信息的行,如下所示:
vp01ob__0 vp01ob__1 vp01ob__2 vp01ob__3 vp01ob__4 vp01ob__5 vp01ob__6 vp01ob__7 vp01ob__8
<chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
3 a NA NA NA NA NA NA NA NA
7 NA b NA NA NA NA NA NA NA
完整案例会丢弃所有内容,我找不到使用 filter_all
或 na.omit()
的方法。任何帮助将不胜感激。
谢谢!
我们可以使用 if_all
library(dplyr)
df1 %>%
filter(!if_all(everything(), is.na))
-输出
#vp01ob__0 vp01ob__1 vp01ob__2 vp01ob__3 vp01ob__4 vp01ob__5 vp01ob__6 vp01ob__7 vp01ob__8
#3 a <NA> NA NA NA NA NA NA NA
#7 <NA> b NA NA NA NA NA NA NA
或 if_any
df1 %>%
filter(if_any(everything(), ~ !is.na(.)))
-输出
#vp01ob__0 vp01ob__1 vp01ob__2 vp01ob__3 vp01ob__4 vp01ob__5 vp01ob__6 vp01ob__7 vp01ob__8
#3 a <NA> NA NA NA NA NA NA NA
#7 <NA> b NA NA NA NA NA NA NA
数据
df1 <- structure(list(vp01ob__0 = c(NA, NA, "a", NA, NA, NA, NA), vp01ob__1 = c(NA,
NA, NA, NA, NA, NA, "b"), vp01ob__2 = c(NA, NA, NA, NA, NA, NA,
NA), vp01ob__3 = c(NA, NA, NA, NA, NA, NA, NA), vp01ob__4 = c(NA,
NA, NA, NA, NA, NA, NA), vp01ob__5 = c(NA, NA, NA, NA, NA, NA,
NA), vp01ob__6 = c(NA, NA, NA, NA, NA, NA, NA), vp01ob__7 = c(NA,
NA, NA, NA, NA, NA, NA), vp01ob__8 = c(NA, NA, NA, NA, NA, NA,
NA)), class = "data.frame", row.names = c("1", "2", "3", "4",
"5", "6", "7"))
使用rowSums()
:
require(dplyr)
df %>% filter(rowSums(!is.na(df)) > 0)
基础R
:
df[rowSums(!is.na(df)) > 0,]
你也可以这样做,但它不是很优雅只是实用:
library(dplyr)
DF %>%
filter(DF %>%
rowwise() %>%
summarise(any(!is.na(c_across(everything())))))
vp01ob__0 vp01ob__1 vp01ob__2 vp01ob__3 vp01ob__4 vp01ob__5 vp01ob__6 vp01ob__7 vp01ob__8
3 a <NA> NA NA NA NA NA NA NA
7 <NA> b NA NA NA NA NA NA NA
您也可以使用这两种解决方案中的任何一种。特别感谢亲爱的@akrun 的建议:
library(purrr)
DF %>%
filter(pmap_lgl(DF, ~ any(!is.na(c(...)))))
或者这次我们进行逐行运算,直接使用filter
:
DF %>%
rowwise() %>%
filter(any(!is.na(c_across(everything()))))
一直在搜索这个,尽管它应该很简单,但我只找到了完整案例的解决方案或选择列的子集然后省略它们的 NA。在我的例子中,我有一个这样的数据框:
vp01ob__0 vp01ob__1 vp01ob__2 vp01ob__3 vp01ob__4 vp01ob__5 vp01ob__6 vp01ob__7 vp01ob__8
<chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
1 NA NA NA NA NA NA NA NA NA
2 NA NA NA NA NA NA NA NA NA
3 a NA NA NA NA NA NA NA NA
4 NA NA NA NA NA NA NA NA NA
5 NA NA NA NA NA NA NA NA NA
6 NA NA NA NA NA NA NA NA NA
7 NA b NA NA NA NA NA NA NA
这是一个非常稀疏的数据框,所以我只想保留包含一些信息的行,如下所示:
vp01ob__0 vp01ob__1 vp01ob__2 vp01ob__3 vp01ob__4 vp01ob__5 vp01ob__6 vp01ob__7 vp01ob__8
<chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
3 a NA NA NA NA NA NA NA NA
7 NA b NA NA NA NA NA NA NA
完整案例会丢弃所有内容,我找不到使用 filter_all
或 na.omit()
的方法。任何帮助将不胜感激。
谢谢!
我们可以使用 if_all
library(dplyr)
df1 %>%
filter(!if_all(everything(), is.na))
-输出
#vp01ob__0 vp01ob__1 vp01ob__2 vp01ob__3 vp01ob__4 vp01ob__5 vp01ob__6 vp01ob__7 vp01ob__8
#3 a <NA> NA NA NA NA NA NA NA
#7 <NA> b NA NA NA NA NA NA NA
或 if_any
df1 %>%
filter(if_any(everything(), ~ !is.na(.)))
-输出
#vp01ob__0 vp01ob__1 vp01ob__2 vp01ob__3 vp01ob__4 vp01ob__5 vp01ob__6 vp01ob__7 vp01ob__8
#3 a <NA> NA NA NA NA NA NA NA
#7 <NA> b NA NA NA NA NA NA NA
数据
df1 <- structure(list(vp01ob__0 = c(NA, NA, "a", NA, NA, NA, NA), vp01ob__1 = c(NA,
NA, NA, NA, NA, NA, "b"), vp01ob__2 = c(NA, NA, NA, NA, NA, NA,
NA), vp01ob__3 = c(NA, NA, NA, NA, NA, NA, NA), vp01ob__4 = c(NA,
NA, NA, NA, NA, NA, NA), vp01ob__5 = c(NA, NA, NA, NA, NA, NA,
NA), vp01ob__6 = c(NA, NA, NA, NA, NA, NA, NA), vp01ob__7 = c(NA,
NA, NA, NA, NA, NA, NA), vp01ob__8 = c(NA, NA, NA, NA, NA, NA,
NA)), class = "data.frame", row.names = c("1", "2", "3", "4",
"5", "6", "7"))
使用rowSums()
:
require(dplyr)
df %>% filter(rowSums(!is.na(df)) > 0)
基础R
:
df[rowSums(!is.na(df)) > 0,]
你也可以这样做,但它不是很优雅只是实用:
library(dplyr)
DF %>%
filter(DF %>%
rowwise() %>%
summarise(any(!is.na(c_across(everything())))))
vp01ob__0 vp01ob__1 vp01ob__2 vp01ob__3 vp01ob__4 vp01ob__5 vp01ob__6 vp01ob__7 vp01ob__8
3 a <NA> NA NA NA NA NA NA NA
7 <NA> b NA NA NA NA NA NA NA
您也可以使用这两种解决方案中的任何一种。特别感谢亲爱的@akrun 的建议:
library(purrr)
DF %>%
filter(pmap_lgl(DF, ~ any(!is.na(c(...)))))
或者这次我们进行逐行运算,直接使用filter
:
DF %>%
rowwise() %>%
filter(any(!is.na(c_across(everything()))))