这是我的数据帧
df1 = structure(list(item = c(NA, "polygon", NA, NA, NA, NA, NA, "polygon",
"polygon", "0", NA, "polygon", "polygon"), identity = c("pol",
"0", NA, NA, NA, NA, "0", "pol", "pol", "0", NA, "pol", "pol"
), unique = c("polx", "0", "0", "0", "0", "0", "0", "polx", "0",
"0", NA, "polx", "0"), detect = c("ox", "0", "0", "0", "0", "0",
NA, NA, "ox", "0", NA, "ox", NA), structure = c("hex", "0", "0",
"0", "0", "0", NA, "hex", "hex", "0", NA, "hex", "hex"), key = c("IUGDG",
"0", "0", "0", NA, "0", NA, "IUGDG", "IUGDG", "0", NA, "IUGDG",
"IUGDG"), code = c("adg434kk", "0", "0", "0", NA, "0", NA, "adg434kk",
"adg434kk", "0", NA, "adg434kk", "adg434kk")), class = "data.frame", row.names = c(NA,
-13L))
item identity unique detect structure key code
1 <NA> pol polx ox hex IUGDG adg434kk
2 polygon 0 0 0 0 0 0
3 <NA> <NA> 0 0 0 0 0
4 <NA> <NA> 0 0 0 0 0
5 <NA> <NA> 0 0 0 <NA> <NA>
6 <NA> <NA> 0 0 0 0 0
7 <NA> 0 0 <NA> <NA> <NA> <NA>
8 polygon pol polx <NA> hex IUGDG adg434kk
9 polygon pol 0 ox hex IUGDG adg434kk
10 0 0 0 0 0 0 0
11 <NA> <NA> <NA> <NA> <NA> <NA> <NA>
12 polygon pol polx ox hex IUGDG adg434kk
13 polygon pol 0 <NA> hex IUGDG adg434kk
预期输出:
item identity unique detect structure key code
1 <NA> <NA> 0 0 0 0 0
2 <NA> <NA> 0 0 0 0 0
3 <NA> <NA> 0 0 0 <NA> <NA>
4 <NA> <NA> 0 0 0 0 0
5 <NA> 0 0 <NA> <NA> <NA> <NA>
我尝试了一些类似于我之前在"如何在任何列中筛选na和空值而不是0"中发布的内容,并更改为如下语法,但不起作用:
df1 %>%
filter(if_any(item:code, ~ is.na(.x)),
if_any(item:code, ~ .x == 0),
!if_any(item:code, complete.cases))
有人能帮忙吗?谢谢
# Extract rows that only consists of NA and zero
df2 <- df1[ rowSums(is.na(df1) | (df1 == 0)) == ncol(df1), ]
> df2
item identity unique detect structure key code
3 <NA> <NA> 0 0 0 0 0
4 <NA> <NA> 0 0 0 0 0
5 <NA> <NA> 0 0 0 <NA> <NA>
6 <NA> <NA> 0 0 0 0 0
7 <NA> 0 0 <NA> <NA> <NA> <NA>
10 0 0 0 0 0 0 0
11 <NA> <NA> <NA> <NA> <NA> <NA> <NA>
# Exclude rows with only NA and zero
df3 <- df2[ rowSums(is.na(df2)) != ncol(df2) & rowSums(is.na(df2)) > 0, ]
> df3
item identity unique detect structure key code
3 <NA> <NA> 0 0 0 0 0
4 <NA> <NA> 0 0 0 0 0
5 <NA> <NA> 0 0 0 <NA> <NA>
6 <NA> <NA> 0 0 0 0 0
7 <NA> 0 0 <NA> <NA> <NA> <NA>
我自己设法解决了这个问题:
df2 <- filter(df1, if_all(everything(), ~ is.na(.) | .x == 0)) %>%
filter(if_any(item:code, ~ .x == 0),
if_any(item:code, ~ is.na(.)))
item identity unique detect structure key code
1 <NA> <NA> 0 0 0 0 0
2 <NA> <NA> 0 0 0 0 0
3 <NA> <NA> 0 0 0 <NA> <NA>
4 <NA> <NA> 0 0 0 0 0
5 <NA> 0 0 <NA> <NA> <NA> <NA>
filter(df1, if_all(everything(), ~ is.na(.) | .x == 0))
给出包含的任何列的所有行
item identity unique detect structure key code
1 <NA> <NA> 0 0 0 0 0
2 <NA> <NA> 0 0 0 0 0
3 <NA> <NA> 0 0 0 <NA> <NA>
4 <NA> <NA> 0 0 0 0 0
5 <NA> 0 0 <NA> <NA> <NA> <NA>
6 0 0 0 0 0 0 0
7 <NA> <NA> <NA> <NA> <NA> <NA> <NA>
并执行
filter(if_any(item:code, ~ .x == 0),
if_any(item:code, ~ is.na(.)))
只捕获具有同时具有NA和0 的任何列的行