与えられた文字列
test_1<-"abc def,ghi klm"
test_2<-"abc, def ghi klm"
入手したい
"abc"
"def"
"ghi"
ただし、strsplitを使用する場合、strsplitは最初の値を使用して最初の分割を行い、2番目の値を使用して2番目の分割を行うため、文字列内の分割値の順序を知る必要があります。
しかし、これはそうではありません:
strsplit(test_1, c(",", " "))
strsplit(test_2, c(" ", ","))
strsplit(test_2, split=c("[:punct:]","[:space:]"))[[1]]
単一の手順で分割値のいずれかが見つかった場合は、文字列を分割しようとしています。
実際、strsplit
もgrepパターンを使用します。 (コンマは正規表現のメタ文字ですが、スペースはそうではありません。したがって、パターン引数のコンマを二重にエスケープする必要があります。したがって、"\\s"
は必要以上に読みやすさを向上させるためのものです):
> strsplit(test_1, "\\, |\\,| ")
[[1]]
[1] "abc" "def" "ghi" "klm"
> strsplit(test_2, "\\, |\\,| ")
[[1]]
[1] "abc" "def" "ghi" "klm"
両方を使用しない場合\\,
および\\,
(SOが表示されない余分なスペースに注意)あなたはいくつかのcharacter(0)値を取得しているでしょう。
> strsplit(test_2, "\\,\\s|\\,|\\s")
[[1]]
[1] "abc" "def" "ghi" "klm"
@Fojtasekは非常に適切です。文字クラスを使用すると、暗黙的な論理ORが作成されるため、タスクが簡単になることがよくあります。
> strsplit(test_2, "[, ]+")
[[1]]
[1] "abc" "def" "ghi" "klm"
> strsplit(test_1, "[, ]+")
[[1]]
[1] "abc" "def" "ghi" "klm"
正規表現が気に入らない場合は、strsplit()
を複数回呼び出すことができます:
strsplits <- function(x, splits, ...)
{
for (split in splits)
{
x <- unlist(strsplit(x, split, ...))
}
return(x[!x == ""]) # Remove empty values
}
strsplits(test_1, c(" ", ","))
# "abc" "def" "ghi" "klm"
strsplits(test_2, c(" ", ","))
# "abc" "def" "ghi" "klm"
更新追加された例
strsplits(test_1, c("[[:punct:]]","[[:space:]]"))
# "abc" "def" "ghi" "klm"
strsplits(test_2, c("[[:punct:]]","[[:space:]]"))
# "abc" "def" "ghi" "klm"
ただし、正規表現を使用する場合は、@ DWinのアプローチを使用することもできます。
strsplit(test_1, "[[:punct:][:space:]]+")[[1]]
# "abc" "def" "ghi" "klm"
strsplit(test_2, "[[:punct:][:space:]]+")[[1]]
# "abc" "def" "ghi" "klm"
strsplit(test_1, "\\W")
を使用できます。
test_1<-"abc def,ghi klm"
test_2<-"abc, def ghi klm"
key_words <- c("abc","def","ghi")
matches <- str_c(key_words, collapse ="|")
str_extract_all(test_1, matches)
str_extract_all(test_2, matches)