2011-01-17 2 views
4

Использование rSymPy решить систему уравнений, я получил значения х и у, которые решают систему в виде строки символов, как это:Помощь по регулярному выражению

"[(1.33738072607023, 27.9489435205271)]" 

Как я должен назначить эти 2 значения в переменные x, y?

ответ

4

Чтобы разбить строку, вы можете использовать:

vect <- as.numeric(strsplit(gsub("[^[:digit:]\\. \\s]","",x)," ")) 
x <- vect[1] 
y <- vect[2] 

Это удаляет все, что не является пространством, точка или цифра. strsplit разбивает строку, оставшуюся в векторе. См. Также соответствующие файлы справки.

Назначение может выполняться в цикле или с использованием функции Гэвина. Я бы назвал их.

names(vect) <-c("x","y") 
vect["x"] 
     x 
1.337381 

Для больших наборов данных мне нравится держать вещи вместе, чтобы не перегружать рабочее пространство именами.

+0

@Joris, вы можете 'assign' в другую среду и прикрепить ее, который имеет эффект сохранения глобальной окружающей среды в чистоте, но позволяя прямым доступ к объектам. –

+0

для назначения некоторых x и y, что кажется очень переполненным. И действительно, можно начать играть со средой, но лично я предпочитаю списки. Точно так же, идет немного быстрее и дает меньше отладки головных болей. YMMV –

+0

@Joris, который был в ответ на линию «больших наборов данных»; согласитесь, это слишком много для примера @ Брани. Мне тоже нравятся списки, но вам все равно нужно индексировать их в список для доступа к компонентам или использовать 'with()', если вы не присоедините его ... –

2

Вот несколько шагов, которые сделают то, что вы хотите сделать. Не могу сказать, что это является наиболее эффективным и элегантное решение доступно ...

string <- "[(1.33738072607023, 27.9489435205271)]" 
string <- gsub("[^[:digit:]\\. \\s]", "", string) 
splt <- strsplit(string, " ")[[1]] 
names(splt) <- c("x","y") 
FOO <- function(name, strings) { 
    assign(name, as.numeric(strings[name]), globalenv()) 
    invisible() 
} 
lapply(c("x","y"), FOO, strings = splt) 

Последняя строка вернется:

> lapply(c("x","y"), FOO, strings = splt) 
[[1]] 
NULL 

[[2]] 
NULL 

И мы x и y назначены в глобальной среде

> x 
[1] 1.337381 
> y 
[1] 27.94894 
+0

+1 для функции –

2

strapply в пакете gsubfn позволяет довольно легко извлекать числа из строк, используя только относительно простое регулярное выражение. Здесь s является строкой ввода и v является числовым вектором с двумя числами:

library(gsubfn) 
v <- strapply(s, "[0-9.]+", as.numeric)[[1]] 
x <- v[1] 
y <- v[2] 
Смежные вопросы