【问题标题】:Import the output of an R script with Python使用 Python 导入 R 脚本的输出
【发布时间】:2020-09-15 15:53:22
【问题描述】:

我在这个 stackoverflow 中的第一篇文章! :)

我正在尝试使用 Python 导入表(R 脚本的输出)。 这对于避免翻译在 R 中设计复杂 data.table 的巨大脚本非常有帮助。

现在我知道如何使用以下代码使用 Python 调用 R 脚本:

import os 
import subprocess
 
#Launch selected script
command = 'C:/Program Files/R/R-3.4.0/bin/x64/Rscript.exe'
path2script = 'C:/mypath/myscript.R'
cmd = [command, path2script]
a = subprocess.call(cmd)

但是我不知道如何使用表格,R 代码的输出,使用我的 Python 脚本。你有什么想法吗?

非常感谢

编辑:

我尝试了下面@punter 的解决方案

import subprocess

with subprocess.Popen(['/command/to/run', '/other/parameters'], stdout=subprocess.PIPE) as proc:
    table = proc.stdout.read()

然后表格作为一个奇怪的格式是这样的:(它是一个子集)

A\r\n COL1 COL2 COL3\r\n 1: 2015-06-17 05:19 NA <NA>\r\n 2: 2015-06-17 05:19 NA <NA>\r\n 3: 2015-06-17 05:19 NA <NA>\r\n 4: 2015-06-17 05:19 NA <NA>\r\n 5: 2015-06-17 05:19:29 NA <NA>\r\n 

当我尝试下面的代码时,我得到了列名中的所有内容

s=str(table) 
data = StringIO(s) 
df=pd.read_csv(data)

[0 行 x 111 列]

编辑 2 号

在 str(table, "ISO-8859-1") 之类的 str 中尝试使用这个“ISO-8859-1”似乎可以正常工作,我注意到我的脚本中有多个表。 我正在以一种干净的方式重新运行所有内容,我希望它会起作用! :)

【问题讨论】:

  • 能否将 R 脚本的输出保存到文件中,以便稍后在 Python 代码中打开?
  • 您好,感谢您的回答。我确实可以,但我的桌子很大(数百万行),所以我想看看在此之前是否还有其他选择。
  • 您有什么快速的方法可以在 R 中生成大表吗?我是 R 新手,找不到任何要打印的大表来测试解决方案。如果您能回答上述问题,那就太好了。同时查看我的解决方案。该解决方案可能无法按大表的要求工作。
  • 您好@punter147,非常感谢。您可以使用此代码生成大表:test
  • 感谢您提供的脚本,我正在尝试使用我的 R 代码(运行它大约需要 30 分钟)

标签: python r python-requests subprocess method-call


【解决方案1】:

一般来说,对于任何进程,stdout 都可以如下捕获:

import subprocess

with subprocess.Popen(['/command/to/run', '/other/parameters'], stdout=subprocess.PIPE) as proc:
    table = proc.stdout.read()

这是一个阻塞调用,这意味着执行将在 table = proc.stdout.read() 处停止。

注意 上面的代码对于大表可能无法正常工作,因为进程会在上面显示的行阻塞很长时间。

【讨论】:

  • 谢谢你,我可以运行它,但我的输出不是一个表格,而是一个奇怪的格式,如下所示:A\r\n COL1 COL2 COL3\r\n 1: 2015-06-17 05 :19 NA \r\n 2: 2015-06-17 05:19 NA \r\n 3: 2015-06-17 05:19 NA \r\n 4: 2015- 06-17 05:19 NA \r\n 5: 2015-06-17 05:19:29 NA \r\n --- 知道如何解决这个问题吗?
  • 我尝试运行下面的代码,但我得到这样的输入 [0 rows x 111 columns] s=str(table) data = StringIO(s) df=pd.read_csv(data)
【解决方案2】:

我会看看 r2py 接口。这允许您从 R 转换为 pandas 对象:https://pandas.pydata.org/pandas-docs/version/0.22.0/r_interface.html

您可以将表存储在 RData 文件中,然后将其加载到 python 中。

【讨论】:

  • 好吧,问题是明确地征求意见,没有任何工作示例,我想这是你能做的最好的......
  • 您好@pieterbons 非常感谢您的回答,我也尝试使用 rpy2,但在运行“import rpy2”时收到错误消息,因为它无法访问 R.dlll
【解决方案3】:

考虑调整 R 脚本以使用 write.csv() 作为最后一行没有文件名以将数据转储到控制台。这将允许引用字符串值。然后在 Python 中,使用subprocess.Popen 接收带有字节处理的输出,以便迁移到 Pandas 数据帧中。

R

...

write.csv(my_r_df, file="", row.names=FALSE)

Python

import subprocess
from io import StringIO
import pandas as pd
 
# RUN R SCRIPT
command = r'C:\Path\To\Rscript.exe'
path2script = r'C:\Path\To\R\Code.R'

a = subprocess.Popen([command, path2script], 
                      stdin=subprocess.PIPE, 
                      stdout=subprocess.PIPE, 
                      stderr=subprocess.PIPE)
                      
output, error = a.communicate()

# IMPORT PANDAS DATA FRAME
my_pandas_df = pd.read_csv(StringIO(output.decode('utf-8')))

my_pandas_df

当然,您也可以让 R 简单地将数据写入 .csv,然后导入 Pandas。

【讨论】:

  • 谢谢,我正在尝试这个
【解决方案4】:

您可以将 R 数据框复制到剪贴板,然后使用从剪贴板读取将其加载到 Pandas。这是它的工作原理。

使用此代码将 R 数据帧复制到剪贴板,然后转到 Jupyter 并使用 pd.read_clipboard()。

# If you are on Windows, use:
# R-Studio
write.table(df, "clipboard", sep="\t", col.names=TRUE)

# Jupyter
df = pd.read_clipboard(sep="\t")

# On Mac, use:
# R-Studio
clip <- pipe("pbcopy", "w")                       
write.table(df, file=clip)                               
close(clip)

# Jupyter Notebook
df = pd.read_clipboard()

【讨论】:

  • 您好,谢谢,我试过了,但是我得到了一个只有几行的表格,并且只填充了 NA,我不知道为什么
猜你喜欢
  • 2020-05-08
  • 1970-01-01
  • 2015-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-02
  • 1970-01-01
  • 2020-09-21
相关资源
最近更新 更多