Страница 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]
 выдаёт нужный результат для отдельно взятой строки, однако, новый столбец заполняется полностью значением полученным после обработки самой первой ячейки (вместо 1, 2, 3 получается 1, 1, 1). Каким образом надо подправить выражение, чтобы оно заработало как следует?
 
			
					
				Re: Регулярные выражения для работы со строками
				Добавлено: 11 мар 2013, 07:10
				 gamm
				SS_Rebelious писал(а):Каким образом надо подправить выражение, чтобы оно заработало как следует?
fast & durty solution  
 
 
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 
 
  
Спасибо! Видимо работает... Но после двух часов ожидания (в колонке около полумиллиона строк) я просто завершил процесс. 
Можно ли как-то улучшить производительность?
P.S. Саму задачу я уже выполнил - 2 часа вполне достаточно, чтобы на предыдущих этапах обработки найти способ предотвратить необходимость обработки 500000 строк   

 
			
					
				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, и т.д.) ?