Dplyrとstringrを組み合わせて、データフレーム内の複数のパターンを検出しようとしています。さまざまな列をテストしたいので、dplyrを使用したいと思います。
サンプルデータは次のとおりです。
test.data <- data.frame(item = c("Apple", "Bear", "Orange", "Pear", "Two Apples"))
fruit <- c("Apple", "Orange", "Pear")
test.data
item
1 Apple
2 Bear
3 Orange
4 Pear
5 Two Apples
私が使いたいのは次のようなものです。
test.data <- test.data %>% mutate(is.fruit = str_detect(item, fruit))
受け取ります
item is.fruit
1 Apple 1
2 Bear 0
3 Orange 1
4 Pear 1
5 Two Apples 1
非常に簡単なテストが機能します
> str_detect("Apple", fruit)
[1] TRUE FALSE FALSE
> str_detect("Bear", fruit)
[1] FALSE FALSE FALSE
しかし、dplyrがなくても、これをデータフレームの列で機能させることはできません。
> test.data$is.fruit <- str_detect(test.data$item, fruit)
Error in check_pattern(pattern, string) :
Lengths of string and pattern not compatible
誰かがこれを行う方法を知っていますか?
_str_detect
_は長さ1のパターンのみを受け入れます。 paste(..., collapse = '|')
を使用して1つの正規表現に変換するか、any
を使用します。
_sapply(test.data$item, function(x) any(sapply(fruit, str_detect, string = x)))
# Apple Bear Orange Pear Two Apples
# TRUE FALSE TRUE TRUE TRUE
str_detect(test.data$item, paste(fruit, collapse = '|'))
# [1] TRUE FALSE TRUE TRUE TRUE
_
この単純なアプローチは、完全一致でうまく機能します。
test.data %>% mutate(is.fruit = item %in% fruit)
# A tibble: 5 x 2
item is.fruit
<chr> <lgl>
1 Apple TRUE
2 Bear FALSE
3 Orange TRUE
4 Pear TRUE
5 Two Apples FALSE
このアプローチは、部分一致(質問です)で機能します。
test.data %>%
rowwise() %>%
mutate(is.fruit = sum(str_detect(item, fruit)))
Source: local data frame [5 x 2]
Groups: <by row>
# A tibble: 5 x 2
item is.fruit
<chr> <int>
1 Apple 1
2 Bear 0
3 Orange 1
4 Pear 1
5 Two Apples 1