无法将R分析输出移回Python(rpy2)



我试图将一些数据从python传递到R,然后将结果返回到python,但似乎无法使其工作。

我成功地将数据传递给R,并在数据上运行自定义函数,甚至获得输出。我遇到的困难是将统计输出作为数据帧返回到python中。我尝试过使用rpy2,甚至将其导出到.csv文件中重新导入,但这两种方法都无法运行。当我试图把它推回到熊猫身上时,我得到了一个无法强迫的错误。当谈到保存到.csv时,我似乎无法使用我的";结果";对象在阅读中,检查R全局环境中的内容似乎可以帮助我弄清楚,但我也没能弄清楚如何做到这一点。

如有任何有用的意见,我们将不胜感激。


#import statements
import rpy2
print(rpy2.__version__)
import rpy2.robjects as robjects
from rpy2.robjects.packages import importr
import rpy2.robjects.numpy2ri
rpy2.robjects.numpy2ri.activate()
base = importr('base')
utils = importr('utils')
name = 'test_subject'
#Sample data to analyze
list1 = [0,1,2,3,4,5,6,7,8,9,10] # analysis window
list2 = [1,5,6,8,7,9,10,8,7,6,3] # nnumber of responses per bin
#Convert data to R objects
set1 = robjects.IntVector(list1)
set2 = robjects.IntVector(list2)
makeDataFrame = robjects.r('''data.frame ''')
df = makeDataFrame(x = set1, y = set2)

# Create curve fitting function
curve_fit = robjects.r('''
curve_fit <- function(df, plot = FALSE){ control <- nls.control(maxiter = 1000, tol = 0.000100, minFactor = 1/2064,
printEval = FALSE, warnOnly = TRUE)

fit <- nls(y ~ d+a*exp(-.5*((x-t0)/b)^2)+c*(x-t0), 
data = df,
start = list(a = 1, b = 10, t0 = 10, c = 1, d = 1),
algorithm = "port",
control = control)

if (plot){
fitFnc <- function(x) predict(fit, list(x=x))
par(mfrow = c(1, 1))
plot(df$x, df$y, xlim = c(0,45))
curve(fitFnc, from=.5, to=45, add = TRUE)
}
return(list("params" = summary(fit), 
"r2" = cor(predict(fit), df$y)^2))
}''')
#run function on data
results = curve_fit(df, plot = True)
#Show Results
print('results', results)
print(type(results))

出现问题

return(list("params" = summary(fit), "r2" = cor(predict(fit), df$y)^2))

列表中的第一项";params";是R的一个汇总表。虽然这是我想要的数据,但它是一个无法细分的单个对象,因为它本质上是R输出表的图像。我需要返回的是一个数据帧,如下面的代码所示。

return(data.frame(coef(summary(fit)), r2 = cor(predict(fit), df$y)^2))

这返回了一个对象列表,然后我可以将其转换为numpy数组并在python中进行操作。

这是完整的代码。

#import statements
import rpy2
print(rpy2.__version__)
import rpy2.robjects as robjects
from rpy2.robjects.packages import importr
import rpy2.robjects.numpy2ri
import numpy as np
rpy2.robjects.numpy2ri.activate()
base = importr('base')
utils = importr('utils')


#Sample data to analyze
list1 = [0,1,2,3,4,5,6,7,8,9,10] # analysis window
list2 = [1,5,6,8,7,9,10,8,7,6,3] # nnumber of responses per bin
#Convert data to R objects and place in data frame
set1 = robjects.IntVector(list1)
set2 = robjects.IntVector(list2)
makeDataFrame = robjects.r('''data.frame ''')
df = makeDataFrame(x = set1, y = set2)

# Create curve fitting function in r
curve_fit = robjects.r('''
#Fit function
curve_fit <- function(df, plot = FALSE){ control <- nls.control(maxiter = 1000, tol = 0.000100, minFactor = 1/2064,
printEval = FALSE, warnOnly = TRUE)
#Specify formula to fit  
fit <- nls(y ~ d+a*exp(-.5*((x-t0)/b)^2)+c*(x-t0), 
data = df,
start = list(a = 1, b = 10, t0 = 10, c = 1, d = 1),
algorithm = "port",
control = control)

# Create plot of curve 
if (plot){
fitFnc <- function(x) predict(fit, list(x=x))
par(mfrow = c(1, 1))
plot(df$x, df$y, xlim = c(0,45))
curve(fitFnc, from=.5, to=45, add = TRUE)}
#returns data in R dataframe
return(data.frame(coef(summary(fit)), r2 = cor(predict(fit), df$y)^2))
}''')

#run function on data
results = curve_fit(df, plot = True)
results = np.array(results) #convert to numpy array
#Show Results
print('results', results)
print(type(results))

最新更新