我有一個非常大的資料框(下面的一個片段),我想過濾它。如果以“i10_pr”開頭的列中至少有一個條目以我在list.
這是我的資料框和串列的示例
#> 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
#> 3 2481935 3 5A09357 3C1ZX8Z 06HN33Z B54CZZA 0W993ZX 1
#> 4 4605446 1 5A1955Z 0BH17EZ 03HY32Z 02HV33Z GZ58ZZZ 3
#> 5 7287173 2
list <- c("0B", "ND", "3J", "BW", "BR") 0
輸出如下所示:
#> 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
uj5u.com熱心網友回復:
我們可以為用于查找具有至少一個匹配項的行filter的列創建一個正則運算式模式starts_with 'i10_pr'if_any
library(stringr)
library(dplyr)
v1 <- c("0B", "ND", "3J", "BW", "BR")
pat <- sprintf('^(%s)', str_c(v1, collapse = "|"))
df1 %>%
filter(if_any(starts_with("i10_pr"), ~ str_detect(.x, pat)))
-輸出
ID visitorder i10_pr1 i10_pr2 i10_pr3 i10_pr4 i10_pr5 sum
1 7466851 3 BW28ZZZ BR30Y0Z BR39Y0Z <NA> <NA> 0
2 7023336 1 0BDC8ZX 0BDC8W7 07D78ZX <NA> <NA> 0
4 4605446 1 5A1955Z 0BH17EZ 03HY32Z 02HV33Z GZ58ZZZ 3
或者提取前兩個字符并使用%in%
df1 %>%
filter(if_any(starts_with("i10_pr"), ~ substr(.x, 1, 2) %in% v1))
-輸出
ID visitorder i10_pr1 i10_pr2 i10_pr3 i10_pr4 i10_pr5 sum
1 7466851 3 BW28ZZZ BR30Y0Z BR39Y0Z <NA> <NA> 0
2 7023336 1 0BDC8ZX 0BDC8W7 07D78ZX <NA> <NA> 0
4 4605446 1 5A1955Z 0BH17EZ 03HY32Z 02HV33Z GZ58ZZZ 3
資料
df1 <- structure(list(ID = c(7466851L, 7023336L, 2481935L, 4605446L),
visitorder = c(3L, 1L, 3L, 1L), i10_pr1 = c("BW28ZZZ", "0BDC8ZX",
"5A09357", "5A1955Z"), i10_pr2 = c("BR30Y0Z", "0BDC8W7",
"3C1ZX8Z", "0BH17EZ"), i10_pr3 = c("BR39Y0Z", "07D78ZX",
"06HN33Z", "03HY32Z"), i10_pr4 = c(NA, NA, "B54CZZA", "02HV33Z"
), i10_pr5 = c(NA, NA, "0W993ZX", "GZ58ZZZ"), sum = c(0L,
0L, 1L, 3L)), class = "data.frame", row.names = c("1", "2",
"3", "4"))
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/513419.html
標籤:r筛选tidyverse
下一篇:如何在R中的列序列中重新編碼值
