在多個欄位中,找尋欄位中包含特定內容之個案

使用 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

與dplyr::if_any 類似的函數

除了 if_any() 以外,dplyr 還有一些類似的函數,可以用來在多個欄位上套用條件。以下是一些常見的函數:

  1. if_all() : 用來檢查所選的欄位中,是否所有欄位都符合條件。如果所有欄位都符合,則返回 TRUE。
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
  1. across() : 用來對多個欄位同時應用轉換或計算。通常與 mutate() 或 summarize() 結合使用。
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
  1. rowwise(): 會讓操作按列進行,常用於需要在每一列中對多個欄位進行邏輯操作或複雜計算的情況,類似 rowwise()+ any() =if_any()
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