如何筛选dataframe中i10_pr列条目前缀匹配指定列表的行
解决方案:筛选DataFrame中指定前缀匹配的行
示例数据准备
先还原你的示例DataFrame和前缀列表:
# 构造示例DataFrame df <- data.frame( ID = c(7466851, 7023336, 2481935, 4605446, 7287173), visitorder = c(3, 1, 3, 1, 2), i10_pr1 = c("BW28ZZZ", "0BDC8ZX", "5A09357", "5A1955Z", ""), i10_pr2 = c("BR30Y0Z", "0BDC8W7", "3C1ZX8Z", "0BH17EZ", ""), i10_pr3 = c("BR39Y0Z", "07D78ZX", "06HN33Z", "03HY32Z", ""), i10_pr4 = c("", "", "B54CZZA", "02HV33Z", ""), i10_pr5 = c("", "", "0W993ZX", "GZ58ZZZ", ""), sum = c(0, 0, 1, 3, 0), stringsAsFactors = FALSE ) # 指定前缀列表 prefix_list <- c("0B", "ND", "3J", "BW", "BR")
方法1:使用tidyverse工具链(dplyr + stringr)
代码简洁可读性强,适合处理大型数据集:
library(dplyr) library(stringr) # 筛选符合条件的行 filtered_df <- df %>% rowwise() %>% mutate(has_match = any(str_starts(c_across(starts_with("i10_pr")), paste0("^(", paste(prefix_list, collapse = "|"), ")")))) %>% filter(has_match) %>% select(-has_match) # 查看结果 print(filtered_df)
代码说明:
rowwise():按行处理数据c_across(starts_with("i10_pr")):选取所有以'i10_pr'开头的列str_starts(..., pattern):检查字符串是否匹配指定前缀,这里用paste把前缀列表拼接成正则表达式^(0B|ND|3J|BW|BR)any(...):判断该行是否至少有一个匹配项filter(has_match):保留匹配的行,最后移除辅助列has_match
方法2:使用Base R
无需加载额外包,用原生R实现:
# 生成正则匹配模式 pattern <- paste0("^(", paste(prefix_list, collapse = "|"), ")") # 获取目标列索引 target_cols <- grep("^i10_pr", names(df)) # 对每行检查是否有匹配项 match_rows <- apply(df[, target_cols], 1, function(row) { any(grepl(pattern, row, perl = TRUE)) }) # 筛选行 filtered_df <- df[match_rows, ] # 查看结果 print(filtered_df)
代码说明:
grep("^i10_pr", names(df)):定位所有以'i10_pr'开头的列apply(..., 1, function(row)):按行遍历目标列grepl(pattern, row):检查单元格是否匹配前缀正则,any()判断该行是否存在至少一个匹配- 用逻辑向量
match_rows筛选DataFrame的行
两种方法都会得到你期望的输出:
#> ID visitorder i10_pr1 i10_pr2 i10_pr3 i10_pr4 i10_pr5 sum #> 1 7466851 3 BW28ZZZ BR30Y0Z BR39Y0Z 0 #> 2 7023336 1 0BDC8ZX 0BDC8W7 07D78ZX 0 #> 4 4605446 1 5A1955Z 0BH17EZ 03HY32Z 02HV33Z GZ58ZZZ 3
内容的提问来源于stack exchange,提问作者ltong
相关产品推荐
相关产品推荐

