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]]
Я хочу разбить строку везде, где я нахожу любое из моих значений разбиения за один шаг.
Ответы
Ответ 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)