从 Python 到 R 的数据帧转换:将 Python 字符串保留为 R 字符而不是 R 因子

Dataframe conversion from Python to R: keep Python string as R chr not R factor

祝大家新年快乐,2017 年编码愉快。

我有一个 Python pandas 数据帧,我需要将其转换为 R 数据帧。 我的 Python pandas 数据框如下所示:

'data.frame':   302 obs. of  19 variables:
 $ typ     : chr  "page" "area" "par" "line" ...
 $ id      : chr  "page_1" "block_1_1" "par_1_1" "line_1_1" ...
 $ page    : num  1 1 1 1 1 1 1 1 1 1 ...
 $ area    : num  NA 1 1 1 2 2 2 2 3 3 ...
 $ par     : num  NA NA 1 1 NA 2 2 2 NA 3 ...
 $ line    : num  NA NA NA 1 NA NA 2 2 NA NA ...
 $ x1      : num  0 0.02 36.91 36.91 0.03 ...
 $ y1      : num  0 26.1 4.2 4.2 26.1 ...
 $ x2      : num  100 5.95 36.92 36.92 5.97 ...
 $ y2      : num  100 26.09 8.29 8.29 44.54 ...
 $ length  : num  100 5.93 0.02 0.02 5.93 ...
 $ heigth  : num  100 0.01 4.09 4.09 18.44 ...
 $ txt     : chr  "" "" "" "" ...
 $ strong  : chr  "" "" "" "" ...
 $ special : chr  "" "" "" "" ...
 $ AVGx    : num  50 2.98 36.91 36.91 3 ...
 $ AVGy    : num  50 26.09 6.24 6.24 35.31 ...
 $ SC_NR   : chr  "41151000029" "41151000029" "41151000029" "41151000029" ...
 $ DOK_LFNR: chr  "640" "640" "640" "640" ...

我正在使用:

pandas2ri.activate() 
pandas2ri.py2ri(dataframe)

我得到了以下 R 数据框:

'data.frame':   302 obs. of  19 variables:
 $ typ     : Factor w/ 5 levels "area","line",..: 3 1 4 2 1 4 2 5 1 4 ...
 $ id      : Factor w/ 302 levels "block_1_1","block_1_10",..: 77 1 78 28 12 89 39 216 21 100 ...
 $ page    : num  1 1 1 1 1 1 1 1 1 1 ...
 $ area    : num  NA 1 1 1 2 2 2 2 3 3 ...
 $ par     : num  NA NA 1 1 NA 2 2 2 NA 3 ...
 $ line    : num  NA NA NA 1 NA NA 2 2 NA NA ...
 $ x1      : num  0 0.02 36.91 36.91 0.03 ...
 $ y1      : num  0 26.1 4.2 4.2 26.1 ...
 $ x2      : num  100 5.95 36.92 36.92 5.97 ...
 $ y2      : num  100 26.09 8.29 8.29 44.54 ...
 $ length  : num  100 5.93 0.02 0.02 5.93 ...
 $ heigth  : num  100 0.01 4.09 4.09 18.44 ...
 $ txt     : Factor w/ 189 levels "","[e]","{minutes}",..: 1 1 1 1 1 1 1 107 1 1 ...
 $ strong  : Factor w/ 3 levels "","0","1": 1 1 1 1 1 1 1 2 1 1 ...
 $ special : Factor w/ 1 level "": 1 1 1 1 1 1 1 1 1 1 ...
 $ AVGx    : num  50 2.98 36.91 36.91 3 ...
 $ AVGy    : num  50 26.09 6.24 6.24 35.31 ...
 $ SC_NR   : Factor w/ 1 level "41151000029": 1 1 1 1 1 1 1 1 1 1 ...
 $ DOK_LFNR: Factor w/ 1 level "640": 1 1 1 1 1 1 1 1 1 1 ...

问题在于 R 数据帧具有 factor 类型而不是 chr 类型。我设法用 R 代码修复它:

i <- sapply(df, is.factor)
df[i] <- lapply(df[i], as.character)

有没有办法在转换过程中直接做到这一点?

我正在使用:

python 2.7.12
rpy2 2.8.2
pandas 0.18.1

谢谢 法比恩

我尝试 google 了一点,但我似乎无法找到 pandas2ri.py2ri(dataframe) 函数的良好文档。

R data.frame 函数(以及 as.data.frame 函数)具有布尔值 stringsAsFactors 参数,文档中的参数是

logical: should character vectors be converted to factors? The ‘factory-fresh’ default is TRUE, but this can be changed by setting options(stringsAsFactors = FALSE).

我想 pandas2ri.py2ri(dataframe) 函数以某种方式支持这个,以及所有其他可选参数。

以下链接将为您提供 R 函数的完整文档:

很抱歉,我无法为您提供更多帮助,但我不懂 Python 语言,也不懂 pandas 程序包;(

考虑通过导入 R 的基础包将 Python 中的字符列转换为字符列。显然,pandas2ri.py2ri() 方法仅使用 R 的 data.frame() 的默认功能,该功能将字符呈现为因子。下面使用 rclass 方法,如 rpy2 docs:

中所述
from rpy2.robjects import pandas2ri
from rpy2.robjects.packages import importr

base = importr('base')
pandas2ri.activate()
...

# CONVERT PANDAS DF TO R DF
rdf = pandas2ri.py2ri(pydf)

# FIND COLUMN INDEX OF EACH FACTOR IN DF
factors = [i for i,col in enumerate(rdf) if col.rclass[0] == 'factor']

# CONVERT COLS ITERATIVELY
for f in factors:
    rdf[f] = base.as_character(rdf[f])