【问题标题】:rpy2 does not translate "_" into "."rpy2 不会将“_”翻译成“。”
【发布时间】:2020-02-05 19:27:08
【问题描述】:

我正在尝试使用从 R 使用 rpy2 导入的函数“read.csv”在 Python 中读取 csv 文件。

r_read_csv = robjects.r['read.csv']
r_read_csv("initVar.csv", header = True, row_names = 1)

但是,上面的代码会返回错误消息:

rpy2.rinterface_lib.embedded.RRuntimeError: Error in read.table(file = file, header = header, sep = sep, quote = quote,  : 
    unused argument (row_names = 1)

在 R 中,参数的名称是 row.names。但是,我不能使用点,因为它在 Python 中的含义不同。

我认为 rpy2 将“_”翻译成“.”。至少这是我从他们的documentation 中了解到的。看来我错了。

问题:在这种情况下如何指定row.names = 1

【问题讨论】:

  • 根据stat.ethz.ch/R-manual/R-devel/library/utils/html/… row_names = 1 即使row.name=1 没有用,因为在第一行中没有列标题的情况下,默认行为将第一列作为名称。如果你得到你想要的输出,放下它并尝试。
  • “在没有列标题的情况下” - 但我确实有列标题(参见标题 = True)。所以我认为你的建议不适用于这种情况?

标签: python r rpy2


【解决方案1】:

我确实重现了有趣的错误! rpy2 中的 read.csv 似乎没有继承其父函数 read.table,因此无法识别 row_names 参数。但是,您可以使用read.table,确保指定默认值read.csv

read_tbl = robjects.r['read.table']

rdf = read_tbl("/path/to/data.csv", header = True, row_names = 1, sep = ",")

同样,如果您对 utils 包使用 importr 方法:

from rpy2.robjects.packages import importr
...
utils = importr("utils")

rdf = utils.read_table("/path/to/data.csv", header = True, row_names = 1, sep = ",")

但是,以下两种方法都不适用于 Python,但适用于 R:

Python

read_csv = robjects.r['read.csv']
rdf = read_csv("/path/to/data.csv", row_names = 1)

utils = importr("utils")
rdf = utils.read_csv("/path/to/data.csv", row_names = 1)

R

df <- read.csv("/path/to/data.csv", row.names = 1)

【讨论】:

  • 谢谢,完美运行!如果可以的话,如果您能解释一下您是如何找到答案的,我将不胜感激?你是怎么想的,你采取了什么步骤。这将有助于我下次自己找出答案。
  • 这是更多的知识和经验。在此之前,我知道rpy2 将句号转换为下划线。所以首先我测试了read.csvrobjects 然后importr 在虚拟csv 上重现你的问题。然后,知道read.csvread.table 函数套件的包装,我测试了read.table 发现它确实有效。我查看了docs 还看到row.names 没有暴露为read.csv 中的命名参数,从而得出结论rpy2 没有继承其父调用者。
猜你喜欢
  • 2022-06-21
  • 1970-01-01
  • 2012-10-13
  • 1970-01-01
  • 2010-11-07
  • 1970-01-01
  • 2015-09-22
  • 2015-10-11
  • 2017-10-12
相关资源
最近更新 更多