Ошибка ключевого слова: вызов функции as.geodata в geoR с помощью rpy2

Я получаю SyntaxError: keyword can't be an expression в сценарии, над которым работаю.

Я использую rpy2 (и пакет R geoR) в Python для работы с таблицей данных, которая извлекается из базы данных PostgreSQL с использованием функций базы данных R. Данные представляют собой пространственные данные с координатами и двумя столбцами числовых данных, которые будут использоваться в геостатистической модели.

После вызова запроса к базе данных объект x кадра данных выглядит следующим образом:

    easting northing location attrib1 attrib2    category
1  658394.3 204987.5       p1         4.91        26.17 soil
2  658657.1 205116.7       p2         4.85        27.43 soil
...

Я создаю объект для функций geoR следующим образом:

из rpy2.robjects.packages import importr geo = importr('geoR')

Вызов функции geoR как

y=geo.as_geodata(x)  

работает, НО без аргумента data.col он присваивает атрибуту местоположения атрибут данных. (Первый столбец после атрибутов координат по умолчанию.)

Пытающийся:

y=geo.as_geodata(x,geo.data_col="4:5")

производит:

SyntaxError: keyword can't be an expression

Кажется, я не могу обойти это. Я просмотрел несколько сообщений здесь и посмотрел в Интернете, но я не могу понять это.


person damian    schedule 13.07.2012    source источник


Ответы (2)


Я думаю, что ошибка связана с тем, что вы пытаетесь передать два столбца команде data_col. Вот рабочий пример с использованием набора данных meuse из пакета gstat.

import rpy2.robjects as robjects
from rpy2.robjects.packages import importr 
geo = importr('geoR')
gstat= importr("gstat")
robjects.r("data(meuse)")
x = robjects.r("meuse")
y = geo.as_geodata(x,data_col=5,coords_col="1:2")
vario = geo.variog(y)
robjects.r.plot(vario)

Однако вы заметите, что приведенное выше не работает, потому что geoR, похоже, не получает аргументы coords.col или data.col. Я не уверен, почему это так, но решение этой проблемы состоит в том, чтобы написать функцию-оболочку.

robjects.r('''
geodata_python <- function(obj) {
        return(as.geodata(obj, data.col=5, coords.col=1:2))
}
''')
geodata_wrapper =  robjects.globalenv['geodata_python']
y = geodata_wrapper(x)
vario = geo.variog(y)
robjects.r.plot(vario)

Используя описанный выше метод, вы можете передать дополнительные аргументы функции as.geodata внутри функции geodata_python в среде R.

ХТН

person Jase_    schedule 14.07.2012

Rpy2 — это мост к Python, при необходимости отображающий типы Python на типы R. Здесь вы передаете параметр со значением «4:5», то есть Python str. Этот параметр становится R character (вектор строк в жаргоне R).

Когда вы пишете вызов функции R, такой как foo(bar = 4:5), то, что вы пишете, является кодом R в качестве значения для параметраbar, этот код будет оцениваться, чтобы дать фактический параметр.

Я думаю, что вы хотите:

from rpy2.robjects.vectors import IntVector
y=geo.as_geodata(x, data_col = IntVector((4,5)))

or

base = importr('base')
y=geo.as_geodata(x, data_col = base.c(4,5))
person lgautier    schedule 14.07.2012
comment
Приносим извинения за поздний ответ. Пришлось переходить к другим проектам, но вернулся к этому. Я получил его работу на основе этих ответов. Ваше здоровье! - person damian; 04.10.2012