如何用R语言筛选含NA/空值但不含0的数据行
问题描述
现有如下DataFrame:
df1 = structure(list(item = c("HY04SB", "GSP8Y1", "8OK8N6", "V2RIP7", "51H9V8", "", "5C45YN", "PM271I", "4WVDD9"), weird = c("", "", "", "v1b+m#|1", "f%nfw+j<", "[3-qzg76", "13k{-ftr", "", "sywf|*l!" ), simple = c(14661746L, NA, 88171210L, NA, 0L, 35586016L, NA, 0L, 23761616L), code = c("WX&}Awx:65Dgn9A3", "0", "7jcP!&EAJFT=4=Xv", "}7p92w~STX>2M5TP", "", "EvEH+hV=}6X,aS'Q", "", "r*C'U9LA\"tr$p_X;", "0")), class = "data.frame", row.names = c(NA, -9L))
数据预览:
item weird simple code 1 HY04SB 14661746 WX&}Awx:65Dgn9A3 2 GSP8Y1 NA 0 3 8OK8N6 88171210 7jcP!&EAJFT=4=Xv 4 V2RIP7 v1b+m#|1 NA }7p92w~STX>2M5TP 5 51H9V8 f%nfw+j< 0 6 [3-qzg76 35586016 EvEH+hV=}6X,aS'Q 7 5C45YN 13k{-ftr NA 8 PM271I 0 r*C'U9LA"tr$p_X; 9 4WVDD9 sywf|*l! 23761616 0
需求为:筛选出**包含NA或空值,但行中不存在0(含数值型0和字符型"0")**的行,原使用的filter语句无法正常运行:
df1_na_empty_but_not_zero <- df1 %>% filter(if_any(item: code %in% c(~ is.na(.), ~ !.x == "0", ~.x == "")))
期望输出:
item weird simple code 1 HY04SB 14661746 WX&}Awx:65Dgn9A3 3 8OK8N6 88171210 7jcP!&EAJFT=4=Xv 4 V2RIP7 v1b+m#|1 NA }7p92w~STX>2M5TP 6 [3-qzg76 35586016 EvEH+hV=}6X,aS'Q 7 5C45YN 13k{-ftr NA
修正后的代码
library(dplyr) # 合并条件的写法 df1_na_empty_but_not_zero <- df1 %>% filter( # 确保整行没有0(数值0或字符"0") if_all(everything(), ~ !(.x == 0 | .x == "0")), # 确保整行至少有一个NA或空字符串 if_any(everything(), ~ is.na(.) | .x == "") )
代码解释
if_all(everything(), ~ !(.x == 0 | .x == "0")):遍历所有列,排除任何包含数值0或字符"0"的行(对应原数据中的行2、5、8、9)。if_any(everything(), ~ is.na(.) | .x == ""):遍历所有列,保留至少有一列是NA或空字符串的行(对应原数据中的行1、3、4、6、7)。
运行上述代码后,输出结果与期望完全一致。
内容的提问来源于stack exchange,提问作者Catalyst
相关产品推荐
相关产品推荐

