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

Вопросы по статистическому пакету R. Не обязательно гео.
Ответить
Аватара пользователя
SS_Rebelious
Гуру
Сообщения: 1304
Зарегистрирован: 24 фев 2009, 16:51
Репутация: 99
Ваше звание: GIS pro-fan
Откуда: Lahti / Газ-ПУТИНбург
Контактная информация:

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

Сообщение SS_Rebelious » 11 мар 2013, 00:23

Есть колонка с данными типа 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). Каким образом надо подправить выражение, чтобы оно заработало как следует?
Look for something long enough, and you will find it. Look for something without understanding, and it will find you...
"All paid jobs absorb and degrade the mind." Aristotle
If you take 1 step towards freedom it'll take 2 steps towards you!

gamm
Гуру
Сообщения: 4056
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1054
Ваше звание: программист
Откуда: Казань

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

Сообщение gamm » 11 мар 2013, 07:10

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, '\\.')) превратит список в вектор, нужно взять каждое второе значение и преобразовать в целое. Я просто запустил итератор

Аватара пользователя
SS_Rebelious
Гуру
Сообщения: 1304
Зарегистрирован: 24 фев 2009, 16:51
Репутация: 99
Ваше звание: GIS pro-fan
Откуда: Lahti / Газ-ПУТИНбург
Контактная информация:

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

Сообщение SS_Rebelious » 11 мар 2013, 20:10

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

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

P.S. Саму задачу я уже выполнил - 2 часа вполне достаточно, чтобы на предыдущих этапах обработки найти способ предотвратить необходимость обработки 500000 строк :D
Look for something long enough, and you will find it. Look for something without understanding, and it will find you...
"All paid jobs absorb and degrade the mind." Aristotle
If you take 1 step towards freedom it'll take 2 steps towards you!

Александр Мурый
Гуру
Сообщения: 5173
Зарегистрирован: 26 сен 2009, 16:26
Репутация: 793
Ваше звание: званий не имею
Откуда: Москва

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
Редактор материалов, модератор форума

Аватара пользователя
SS_Rebelious
Гуру
Сообщения: 1304
Зарегистрирован: 24 фев 2009, 16:51
Репутация: 99
Ваше звание: GIS pro-fan
Откуда: Lahti / Газ-ПУТИНбург
Контактная информация:

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

Сообщение SS_Rebelious » 11 мар 2013, 23:13

Александр Мурый писал(а):Использовать спец. утилиты для обработки текста, например, <awk>:
Спасибо! Да, вне R провернуть указанную процедуру абсолютно не проблема. Но меня всё-таки интересует вариант с использованием самого R.
Look for something long enough, and you will find it. Look for something without understanding, and it will find you...
"All paid jobs absorb and degrade the mind." Aristotle
If you take 1 step towards freedom it'll take 2 steps towards you!

gamm
Гуру
Сообщения: 4056
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1054
Ваше звание: программист
Откуда: Казань

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

Сообщение gamm » 12 мар 2013, 12:09

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

nplatonov
Интересующийся
Сообщения: 25
Зарегистрирован: 07 фев 2012, 12:00
Репутация: 20

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

Сообщение nplatonov » 13 мар 2013, 17:14

a <- c("012a_0.1","012a_0.2","012a_0.3")
gsub(".+\\.(.+)$","\\1",a)

gamm
Гуру
Сообщения: 4056
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1054
Ваше звание: программист
Откуда: Казань

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

Сообщение gamm » 13 мар 2013, 18:55

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

Ответить

Вернуться в «R»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 32 гостя