Как strsplit, используя '|'характер, он ведет себя неожиданно? - PullRequest
7 голосов
/ 17 июня 2011

Я хотел бы разбить строку символов в шаблоне "|"

но

unlist(strsplit("I am | very smart", " | "))

[1] "I"     "am"    "|"     "very"  "smart"

или

gsub(pattern="|", replacement="*", x="I am | very smart")    

[1] "*I* *a*m* *|* *v*e*r*y* *s*m*a*r*t*"

Ответы [ 4 ]

16 голосов
/ 17 июня 2011

Проблема в том, что по умолчанию strsplit интерпретирует " | " как регулярное выражение, в котором | имеет особое значение (как "или").

Использовать fixed аргумент:

unlist(strsplit("I am | very smart", " | ", fixed=TRUE))
# [1] "I am"       "very smart"

Побочный эффект ускоряет вычисления.

stringr альтернатива:

unlist(stringr::str_split("I am | very smart", fixed(" | ")))
16 голосов
/ 17 июня 2011

| - метасимвол. Вы должны избежать этого (используя \\ перед ним).

> unlist(strsplit("I am | very smart", " \\| "))
[1] "I am"       "very smart"
> sub(pattern="\\|", replacement="*", x="I am | very smart")
[1] "I am * very smart"

Редактировать. Причина, по которой вам нужны две обратные косые черты, заключается в том, что один префикс обратной косой черты зарезервирован для специальных символов, таких как \n (новая строка) и \t (вкладка). Для получения дополнительной информации смотрите страницу справки ?regex. Другие метасимволы . \ | ( ) [ { ^ $ * + ?

5 голосов
/ 17 июня 2011

Если вы анализируете таблицу , то вызов read.table может быть лучшим вариантом.Крошечный пример:

> txt <- textConnection("I am | very smart")
> read.table(txt, sep='|')
     V1          V2
1 I am   very smart

Поэтому я бы предложил получить страницу вики с помощью Rcurl , взять интересную часть страницы с помощью XML (которая имеет действительно аккуратная функция также для анализа таблиц HTML) и если формат HTML недоступен, вызовите read.table с указанным sep.Удачи!

1 голос
/ 17 июня 2011

Труба '|' является метасимволом, используемым как оператор 'ИЛИ' в регулярном выражении.

попытка unlist(strsplit("I am | very smart", "\s+\|\s+"))

...