Страница 1 из 1

Регулярные выражения для работы со строками

Добавлено: 11 мар 2013, 00:23
SS_Rebelious
Есть колонка с данными типа 012a_0.1, 012a_0.2, 012a_0.3... Надо заполнить другую колонку так чтобы осталось только та часть значений, которые идут после точки. То есть получить строки со значениями 1, 2 и 3 соответственно.

Использую такое выражение:

Код: Выделить всё

library(stringr)
data$new_column <- str_split(data$variable, '\\.')[[1]][2]


str_split(тестовая_строка, '\\.')[[1]][2] выдаёт нужный результат для отдельно взятой строки, однако, новый столбец заполняется полностью значением полученным после обработки самой первой ячейки (вместо 1, 2, 3 получается 1, 1, 1). Каким образом надо подправить выражение, чтобы оно заработало как следует?

Re: Регулярные выражения для работы со строками

Добавлено: 11 мар 2013, 07:10
gamm
SS_Rebelious писал(а):Каким образом надо подправить выражение, чтобы оно заработало как следует?
fast & durty solution :mrgreen:

my.fun<-function(variable) { str_split(data$variable, '\\.')[[1]][2]; }
data$new_column<-unlist(lapply(p[,"variable"],my.fun))

поясню - проблема в единичке вот здесь: [[1]][2] - берется только первый элемент списка. Вроде
unlist(str_split(data$variable, '\\.')) превратит список в вектор, нужно взять каждое второе значение и преобразовать в целое. Я просто запустил итератор

Re: Регулярные выражения для работы со строками

Добавлено: 11 мар 2013, 20:10
SS_Rebelious
gamm писал(а):fast & durty solution :mrgreen:
Спасибо! Видимо работает... Но после двух часов ожидания (в колонке около полумиллиона строк) я просто завершил процесс.

Можно ли как-то улучшить производительность?

P.S. Саму задачу я уже выполнил - 2 часа вполне достаточно, чтобы на предыдущих этапах обработки найти способ предотвратить необходимость обработки 500000 строк :D

Re: Регулярные выражения для работы со строками

Добавлено: 11 мар 2013, 22:04
Александр Мурый
SS_Rebelious писал(а): Можно ли как-то улучшить производительность?
Использовать спец. утилиты для обработки текста, например, <awk>:
1) создаём тестовый файл в 1 миллион строк:

Код: Выделить всё

$ time seq 1 1000000 | awk '{print "012a_0."$1}' > test.txt

real	0m0.712s
user	0m1.220s
sys	0m0.044s
Файл "test.txt" имеет вид

Код: Выделить всё

012a_0.1
012a_0.2
012a_0.3
012a_0.4
012a_0.5
2) Вытаскиваем во вторую колонку только символы после точки:

Код: Выделить всё

$ time awk -F'.' '{print $0,$2}' test.txt > test2.txt 

real	0m1.170s
user	0m1.128s
sys	0m0.040s
Файл "test2.txt" имеет вид

Код: Выделить всё

012a_0.1 1
012a_0.2 2
012a_0.3 3
012a_0.4 4
012a_0.5 5

Re: Регулярные выражения для работы со строками

Добавлено: 11 мар 2013, 23:13
SS_Rebelious
Александр Мурый писал(а):Использовать спец. утилиты для обработки текста, например, <awk>:
Спасибо! Да, вне R провернуть указанную процедуру абсолютно не проблема. Но меня всё-таки интересует вариант с использованием самого R.

Re: Регулярные выражения для работы со строками

Добавлено: 12 мар 2013, 12:09
gamm
SS_Rebelious писал(а):Спасибо! Да, вне R провернуть указанную процедуру абсолютно не проблема. Но меня всё-таки интересует вариант с использованием самого R.
тогда не нужно пользоваться пакетами, которые создают списки - это все очень долго. Я бы поставил (похоже, формат строк фиксирован) на as.integer(substring(p$variable,8))

Re: Регулярные выражения для работы со строками

Добавлено: 13 мар 2013, 17:14
nplatonov
a <- c("012a_0.1","012a_0.2","012a_0.3")
gsub(".+\\.(.+)$","\\1",a)

Re: Регулярные выражения для работы со строками

Добавлено: 13 мар 2013, 18:55
gamm
nplatonov писал(а):a <- c("012a_0.1","012a_0.2","012a_0.3")
gsub(".+\\.(.+)$","\\1",a)
прелесть! никогда не думал, что grep-выражения позволяют вытаскивать часть строки, в документации самого grep это не описано. Где можно почитать про \\1 и как его задавать (наверняка можно и \\2, и т.д.) ?