在R中过滤DataFrame:保留warning为HAS且messages列非NA的行
解决tibble过滤问题
问题背景
现有如下定义的tibble数据框df:
warning = c("HAS","NO","HAS","HAS","HAS") validation = c("OK","OK","WARNING","WARNING","WARNING") a_b_c_messages1 = c(NA,NA,"good catch",NA,NA) D_E_f_messages2 = c(NA,NA,NA,"NOT BAD",NA) g_h_I_messages3 = c(NA,NA,NA,NA,"BETTER") j_k_l_messages4 = c(NA,NA,NA,NA,NA) df = tibble(warning,validation,a_b_c_messages1, D_E_f_messages2,g_h_I_messages3, j_k_l_messages4)
数据结构如下:
# A tibble: 5 × 6 warning validation a_b_c_messages1 D_E_f_messages2 g_h_I_messages3 j_k_l_messages4 <chr> <chr> <chr> <chr> <chr> <lgl> 1 HAS OK NA NA NA NA 2 NO OK NA NA NA NA 3 HAS WARNING good catch NA NA NA 4 HAS WARNING NA NOT BAD NA NA 5 HAS WARNING NA NA BETTER NA
需要筛选出满足以下两个条件的行:
warning列值为"HAS"- 任意列名包含"messages"的列的值不为NA
解决方案
使用dplyr包的filter结合if_any函数可以高效实现需求:
library(dplyr) filtered_df <- df %>% filter( warning == "HAS", if_any(contains("messages"), ~ !is.na(.x)) )
代码解释
warning == "HAS":直接筛选出warning列等于"HAS"的行contains("messages"):自动匹配所有列名包含"messages"的列,无需手动指定列名,适配列名变化if_any(..., ~ !is.na(.x)):检查匹配到的列中是否存在任意一列的值不为NA,满足则保留该行
结果展示
运行上述代码后得到的filtered_df如下:
# A tibble: 3 × 6 warning validation a_b_c_messages1 D_E_f_messages2 g_h_I_messages3 j_k_l_messages4 <chr> <chr> <chr> <chr> <chr> <lgl> 1 HAS WARNING good catch NA NA NA 2 HAS WARNING NA NOT BAD NA NA 3 HAS WARNING NA NA BETTER NA
内容的提问来源于stack exchange,提问作者Homer Jay Simpson
相关产品推荐
相关产品推荐

