web-dev-qa-db-ja.com

複数の順序付けられていない分割引数を持つR strsplit?

与えられた文字列

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]]

単一の手順で分割値のいずれかが見つかった場合は、文字列を分割しようとしています。

45

実際、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"
58
42-

正規表現が気に入らない場合は、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"
6
jthetzel

strsplit(test_1, "\\W")を使用できます。

5
danas.zuokas
 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)
1
zhan2383