【问题标题】:Convert Pandas Dataframe Column To R Factors将 Pandas 数据框列转换为 R 因子
【发布时间】:2016-04-15 06:08:00
【问题描述】:

我正在尝试将 pandas 数据框的一列转换为因子,因为我尝试在 R 中调用的函数需要因子。

pandas2ri.activate()    
#second column of labels has to be converted to factors
labels = read_csv(path_to_csv)
as_factor = ro.r['as.factor']
output = package.function(another_df, as_factor(labels['column_name']))

以下是我得到的错误:

rpy2.rinterface.RRuntimeError: Error in sort.list(y) : 'x' must be atomic for 'sort.list'
Have you called 'sort' on a list?

我该怎么办?

下面的可重现示例:

import pandas as pd

df = pd.DataFrame({'Col': [10, 20],
                   'x': ['Control', 'Low_Cav02']})

from rpy2 import robjects as ro

from rpy2.robjects import pandas2ri
pandas2ri.activate()

as_factor = ro.r['as.factor']

labels = as_factor(df['Col'])
print labels

labels = as_factor(df['x'])
print labels

输出:

[1] 10 20
Levels: 10 20

/Users/swetabh/Envs/damet/lib/python2.7/site-packages/rpy2/robjects/functions.py:106: UserWarning: Error in sort.list(y) : 'x' must be atomic for 'sort.list'
Have you called 'sort' on a list?

  res = super(Function, self).__call__(*new_args, **new_kwargs)
Traceback (most recent call last):
  File "damet/analysis.py", line 26, in <module>
    labels = as_factor(df['x'])
  File "/Users/swetabh/Envs/damet/lib/python2.7/site-packages/rpy2/robjects/functions.py", line 178, in __call__
    return super(SignatureTranslatedFunction, self).__call__(*args, **kwargs)
  File "/Users/swetabh/Envs/damet/lib/python2.7/site-packages/rpy2/robjects/functions.py", line 106, in __call__
    res = super(Function, self).__call__(*new_args, **new_kwargs)
rpy2.rinterface.RRuntimeError: Error in sort.list(y) : 'x' must be atomic for 'sort.list'
Have you called 'sort' on a list?

【问题讨论】:

  • 您能否尝试展示一个我们也可以运行的可重现示例来帮助您?
  • 我不知道它是否能解决你的问题,但 R 的因子相当于熊猫中的类别:df["some_column"].astype("category")
  • @MathieuB 完成。如果这有帮助,请 Lmk。

标签: python r pandas rpy2


【解决方案1】:

这对我来说工作得很好。您使用的是哪个版本的rpy2?

编辑:下面的原始答案 - 我误解了这个问题

如果尝试创建 R DataFrame,rpy2 中的默认转换器会将 Python 列表转换为 R 列表。 如果你想要一个 R 向量,请使用向量的构造函数。

在你的例子中,这可能看起来像:

df = ro.DataFrame({'Col': ro.vectors.IntVector([10, 20]),
                   'x': ro.vectors.StrVector(['Control', 'Low_Cav02'])})

【讨论】:

  • 执行此操作时出现以下错误:ValueError: If using all scalar values, you must pass an index
  • 是的。我以某种方式设法误读了问题并在答案中编写了非工作代码。我现在正在编辑答案。
猜你喜欢
  • 1970-01-01
  • 2011-01-25
  • 2018-01-12
  • 1970-01-01
  • 1970-01-01
  • 2018-03-25
  • 2019-04-16
  • 2016-11-03
  • 1970-01-01
相关资源
最近更新 更多