Подтвердить что ты не робот

R strsplit с несколькими неупорядоченными аргументами разделения?

Для символьной строки

test_1<-"abc def,ghi klm"
test_2<-"abc, def ghi klm"

Я хочу получить

"abc"
"def"
"ghi"

Однако, используя strsplit, нужно знать порядок значений расщепления в строке, поскольку strsplit использует первое значение для первого разделения, второе - для второго... и затем перерабатывает.

Но это не так:

strsplit(test_1, c(",", " "))
strsplit(test_2, c(" ", ","))

strsplit(test_2, split=c("[:punct:]","[:space:]"))[[1]]

Я хочу разбить строку везде, где я нахожу любое из моих значений разбиения за один шаг.

4b9b3361

Ответ 1

Фактически strsplit также использует шаблоны grep:

> strsplit(test_1, "\\, |\\,| ")
[[1]]
[1] "abc" "def" "ghi" "klm"

> strsplit(test_2, "\\, |\\,| ")
[[1]]
[1] "abc" "def" "ghi" "klm"

Без использования как \\,, так и \\, (обратите внимание на дополнительное пространство, которое не отображается SO), вы получили бы некоторые значения символов (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"

Ответ 2

Вы можете пойти с strsplit(test_1, "\\W").

Ответ 3

Если вам не нравятся регулярные выражения, вы можете вызвать 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"

Ответ 4

 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)