使用 dplyr::if_any 和 stringr::str_detect 來處理這樣的問題,下面是範例程式碼,這將會在 dig1欄到 dig4 欄中查找包含 “J86” 的個案。
library(dplyr)
library(stringr)
df= data.frame( "ID" = 1:1000 ,
"dig1" = sample(c("J86","F20","J09","E086") ,1000, replace=T) ,
"dig2" = sample(c("J86","F20",NA,"E086") ,1000, replace=T),
"dig3" = sample(c("J74","F19",NA,"E45" ,"J86",NA ,NA) ,1000, replace=T),
"dig4" = sample(c("J86","F16",NA,"E70" ,"H27",NA ,NA) ,1000, replace=T) )
# 使用 if_any+ str_detect進行多欄尋找
df_filtered <- df %>%
filter(if_any(dig1:dig4, ~ str_detect(., "J86")))
# 查看前5結果
head(df_filtered)
## ID dig1 dig2 dig3 dig4
## 1 3 J86 <NA> <NA> <NA>
## 2 4 J09 <NA> J86 <NA>
## 3 6 J86 J86 <NA> F16
## 4 7 E086 J86 <NA> H27
## 5 8 J09 J86 E45 F16
## 6 11 J86 F20 <NA> E70
除了 if_any() 以外,dplyr 還有一些類似的函數,可以用來在多個欄位上套用條件。以下是一些常見的函數:
library(dplyr)
library(stringr)
df_filtered <- df %>%
filter(if_all(dig1:dig2, ~ str_detect(., "J86")))
# 查看篩選後的結果
head(df_filtered)
## ID dig1 dig2 dig3 dig4
## 1 6 J86 J86 <NA> F16
## 2 19 J86 J86 <NA> <NA>
## 3 23 J86 J86 J86 E70
## 4 28 J86 J86 <NA> <NA>
## 5 58 J86 J86 E45 F16
## 6 76 J86 J86 <NA> H27
library(dplyr)
library(stringr)
df_new <- df %>%
mutate(across(dig1:dig4, ~ str_replace(., "J86", "肺炎併發症")))
# 查看修改後的資料
head(df_new)
## ID dig1 dig2 dig3 dig4
## 1 1 J09 <NA> <NA> <NA>
## 2 2 E086 F20 E45 <NA>
## 3 3 肺炎併發症 <NA> <NA> <NA>
## 4 4 J09 <NA> 肺炎併發症 <NA>
## 5 5 J09 F20 <NA> H27
## 6 6 肺炎併發症 肺炎併發症 <NA> F16
library(dplyr)
library(stringr)
df_filtered2 <- df %>%
rowwise() %>%
filter(any(str_detect(c_across(dig1:dig4), "J86")))
# 查看篩選後的結果
head(df_filtered2)
## # A tibble: 6 × 5
## # Rowwise:
## ID dig1 dig2 dig3 dig4
## <int> <chr> <chr> <chr> <chr>
## 1 3 J86 <NA> <NA> <NA>
## 2 4 J09 <NA> J86 <NA>
## 3 6 J86 J86 <NA> F16
## 4 7 E086 J86 <NA> H27
## 5 8 J09 J86 E45 F16
## 6 11 J86 F20 <NA> E70