bugfix> r > 投稿

名前に特定の文字列が含まれている変数に適用される基準でデータフレームをフィルタリングする方法を見つけようとしています

以下のこの例では、 テスト結果のいずれかに「d」が含まれている被験者を見つけたいと思います。

d=structure(list(ID = c("a", "b", "c", "d", "e"), test1 = c("a", "b", "a", "d", "a"), test2 = c("a", "b", "b", "a", "s"), test3 = c("b", "c", "c", "c", "d"), test4 = c("c", "d", "a", "a", "f")), class = "data.frame", row.names = c(NA, -5L))

dplyrを使用して、を使用して1つずつ書き込むことができます | これはこのような小さな例では機能しますが、私の実際のデータでは時間がかかります。

library(dplyr) library(stringr) d %>% filter(str_detect(d$test1, "d") |str_detect(d$test2, "d") |str_detect(d$test3, "d") |str_detect(d$test4, "d") )

私が得た出力は、被験者b、d、eが基準を満たしていることを示しています。

ID test1 test2 test3 test4 1 b b b c d 2 d d a c a 3 e a s d f

出力は私が必要とするものですが、たとえば、「テスト」という単語を含む変数にフィルター基準を適用する方法がある場合など、より簡単な方法を探していました。 私は知っています contain dplyrの関数で特定の変数を選択しましたが、ここで試しましたが機能しませんでした。

d %>% filter(str_detect(contains("test"), "d"))

このコードを別の方法で書く方法はありますか、それとも同じ目標を達成する別の方法がありますか?

ありがとうございました

回答 1 件
  • ベースRでは使用できます lapply / sapply

    d[Reduce(`|`, lapply(d[-1], grepl, pattern = 'd')), ]
    #d[rowSums(sapply(d[-1], grepl, pattern = 'd')) > 0, ]
    
    #  ID test1 test2 test3 test4
    #2  b     b     b     c     d
    #4  d     d     a     c     a
    #5  e     a     s     d     f
    
    

    興味のある方 dplyr 以下の方法のいずれかを使用できるソリューション:

    library(dplyr)
    library(stringr)
    #1.
    d %>% 
      filter_at(vars(starts_with('test')), any_vars(str_detect(., 'd')))
    #2.
    d %>%
      rowwise() %>%
      filter(any(str_detect(c_across(starts_with('test')), 'd')))
    #3.
    d %>%
      filter(Reduce(`|`, across(starts_with('test'), str_detect, 'd')))
    
    

あなたの答え