【问题标题】:rpy2: How to properly convert NaN to NA from panda.DataFrame to R?rpy2:如何正确地将 NaN 转换为 NA 从 panda.DataFrame 到 R?
【发布时间】:2020-01-07 06:51:07
【问题描述】:

我正在尝试使用 rpy2 库将数据帧从 python 传递到 R。我尝试了以下方法,但失败了。

  • 什么都不做 - 显然它在 python 中是 NaN 并导致运行 时间错误。
  • fillna('NA') - 当由 R 解释时,它是字符而不是 NA。
  • fillna(robjects.NA_Logical) - NaN 将变为 0 而不是 将进行插补。
  • fillna(robjects.NA_real) - 保持为 NaN 并导致运行 时间错误。
  • 在使用 pandas2ri.py2ri() 传入方法之前将其转换为 r 数据帧 - 相同的运行时错误。
import pandas as pd
import rpy2.robjects as robjects
from rpy2.robjects.packages import importr
from rpy2.robjects import pandas2ri
pcaMethods = importr('pcaMethods')
pandas2ri.activate()

train_df = pd.read_csv('C:\\misc\\train.csv')
train_dfNA = train_df.fillna(robjects.NA_Real)
result = pcaMethods.pca(train_dfNA, method="svd", nPcs=2)

我希望在 python 中进行转换和任何其他操作,而 R 仅用于执行我需要的方法(很少但仍然需要)。或者,我知道我可以通过robjects.r 发送 R 代码来执行任务,但这是另一个讨论主题。

编辑:我得到的错误如下

rpy2.rinterface.RRuntimeError: Error in (function (object, method, nPcs = 2, scale = c("none", "pareto",  : Invalid data format.Run checkData(data, verbose=TRUE) for details

【问题讨论】:

  • 你在哪里将 Pandas 数据帧转换为 R 数据帧?你为什么要在 Pandas 数据框中填充 R NA?一个简单的转换应该将 Python 的 NaN 转换为 R 的 NA: r_dataframe = pandas2ri.py2ri(pandas_dataframe)
  • 我正在传入 pandas 数据框以进行缺失值插补。据我所知,当pandas2ri.activate() 时,它将在 R 中自动转换,唯一的问题是我如何让空值(NaN)成为 R 中的 NA。忘了说我实际上已经尝试使用 py2ri() 进行转换,但仍然面临同样的错误。
  • 没有在您的代码中将 Pandas 数据帧转换为 R 数据帧的位置。 .activate() 简单初始化转换器。再次,在调用pcaMethods 之前转换 并且不要运行任何fillna 尝试。
  • 这不是我尝试过的所有代码,只是作为示例的一部分。我刚刚尝试在没有 fillna 的情况下执行 pandas2ri.py2ri(train_df) 并导致相同的错误,因为在传递给 pcaMethods 时缺失值仍然是 NaN。
  • 那么 NA 可以工作,但 NAN 不行?换句话说,如果您只使用 R(不是 Python)来读取包含 NA 值的确切 csv 文件,并调用 pcaMethods,是否会发生任何 R 错误?

标签: python r pandas dataframe rpy2


【解决方案1】:

在 R 中,为不同的数组类型定义了不同的“NA”值。类型转换和类型层次结构使其在执行array[i] <- NA 之类的操作时“正常工作”。

以下是 R 中的一些 NA 值以及它们在 rpy2 中的映射方式:

import rpy2.robjects as ro
print('%12s   %12s   %20s' % ('rpy2 name', 'R', 'rpy2 type'))
for s in ('NA_Character', 'NA_Real', 'NA_Integer', 'NA_Logical'): 
    r = getattr(ro, s) 
    print('%12s   %12s   %20s' % (s, r, r.typeof if hasattr(r, 'typeof')
                                  else 'Native Python object')) 

你应该得到类似的东西:

rpy2 name      R                rpy2 type                                                                           
NA_Character   NA_character_    RTYPES.CHARSXP
NA_Real        NA_real_         Native Python object
NA_Integer     NA_integer_      Native Python object
NA_Logical     NA               Native Python object

这里你使用pandas 来设置你的NA 值,所以调用fillna() 得到的类型在传递给R 时很重要。

关于运行时错误,您没有共享它,但我怀疑这是称为报告缺失值使 PCA 无法执行的 R 函数。

最后,我从文件路径中看到您在 Windows 上使用 rpy2。不幸的是,在 Windows 上使用 rpy2 范围从“不支持”到“甚至不会安装”,具体取决于版本。

【讨论】:

  • 抱歉,我仍然没有得到要传递给 fillna() 的内容,因此结果类型对 R 有效。我想要的类型应该是 NA_real 但我已经尝试传入 robjects.NA_real它将在 pandas 数据框中保持为 NaN 并导致 R 端出现运行时错误。关于错误,我已添加到问题的底部。我已经想办法让它在 Windows 上工作,但不确定这是否是 Windows 中“不支持”的功能之一。
  • 您使用的 rpy2 版本可能已经过时(因为 Windows)并且您面临一个不再存在的转换错误。
  • 我使用的版本是2.9.5 @lgautier
  • rpy2-2.9.x 是在 pandas 相对较新的变化(相对于 NA 处理)发布之前开发的。使用最新的 rpy2 可能是想要使用最新的 pandas 的唯一选择。
猜你喜欢
  • 2018-01-04
  • 2019-02-28
  • 2017-04-01
  • 2019-09-02
  • 2014-09-20
  • 2012-03-25
  • 2015-02-18
  • 2018-01-17
  • 2019-06-12
相关资源
最近更新 更多