which関数を使用して、データフレーム内の複数の文字列を検索しようとしています。data.frameで文字列を検索から答えを拡張しようとしています
データフレームの例は次のとおりです。
df1 <- data.frame(animal=c('a','b','c','two', 'five', 'c'), level=c('five','one','three',30,'horse', 'five'), length=c(10, 20, 30, 'horse', 'eight', 'c'))
1 a five 10
2 b one 20
3 c three 30
4 two 30 horse
5 five horse eight
6 c five c
このデータフレームで、1つの文字列にwhich関数を適用すると、正しい出力which(df1 =="c" , arr.ind = T);df1
が得られます。
row col
[1,] 3 1
[2,] 6 1
[3,] 6 3
しかし、複数の文字列を検索しようとすると、部分的に正しい出力しか得られません。 which(df1 ==c("c", "horse", "five") , arr.ind = T)
row col
[1,] 5 2
[2,] 6 2
期待される出力は次のとおりです。
row col
[1,] 3 1
[2,] 5 1
[3,] 6 1
[4,] 1 2
[5,] 5 2
[6,] 6 2
[7,] 4 3
[8,] 6 3
したがって、私の質問:
c( "c"、 "horse"、 "five")を使用したソリューションが機能しないのはなぜですか?
私はで試しました
which(df1=="c" | df1=="horse" | df1 =="five", arr.ind = T)
これで正しい出力が得られますが、多くの文字列が長すぎる場合、コードを簡潔にするにはどうすればよいですか?
を使用してベクトルをループしlapply
、を実行して==
、を使用Reduce
して単一の論理行列に|
ラップし、でラップすることができます。which
which(Reduce(`|`, lapply(c("c", "horse", "five"), `==`, df1)), arr.ind = TRUE)
# row col
#[1,] 3 1
#[2,] 5 1
#[3,] 6 1
#[4,] 1 2
#[5,] 5 2
#[6,] 6 2
#[7,] 4 3
#[8,] 6 3
または、別のオプションは、データセットの列をループして、mutate_all
でラップすることです。which
library(dplyr)
df1 %>%
mutate_all(list(~ . %in% c("c", "horse", "five"))) %>%
as.matrix %>%
which(., arr.ind = TRUE)
注:ここでは、OPが完全な文字列一致を実行する場合、正規表現や部分一致は必要ありません。部分一致を行うよりも高速である必要があります
通常、複数の要素の%in%
場合は便利ですが、data.frameではなくベクトルでのみ機能します
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加