如何将Rpy2数据帧转换为python列表或元组?

时间:2013-06-13 22:09:45

标签: rpy2

我有一个Rpy2数据框为<class 'rpy2.robjects.vectors.DataFrame'>。如何将每行作为元素转换为Python列表或元组?谢谢!

2 个答案:

答案 0 :(得分:1)

我明白了。如果您正在寻找答案,我希望这会有所帮助:

output = [tuple([df[j][i] for j in range(df.ncol)]) for i in range(df.nrow)]

答案 1 :(得分:1)

我最近偶然发现了一个潜在的问题。给定来自R的数据框:

|   |   a   | c | b |  d  |
|---|-------|---|---|-----|
| 1 | info1 | 2 | 1 | op1 |
| 2 | info2 | 3 | 2 | 3   |
| 3 | info3 | 4 | 3 | 3   |
| 4 | info4 | 5 | 4 | 3   |
| 5 | info5 | 6 | 5 | 3   |
| 6 | info6 | 7 | 6 | 3   |
| 7 | 9     | 8 | 7 | 3   |

(是的我知道 - 一列中的混合数据类型,即str和float可能不太现实,但对于仅有因素的列,情况也是如此)

转换将显示列a和d的索引,而不是通常预期的实际值。问题如rpy2手册中所述:

  

R的因素有点奇怪:它们旨在表示标记的记忆效率矢量,并且为了实现它,将其实现为整数向量,其与标签的(可能更短的)矢量相关联。每个整数表示标签在相关标签矢量中的位置。

以下粗略草案代码是处理此案例的一步:

colnames = list(dataframe.colnames)
rownames=list(dataframe.rownames)
col2data = []
for cn,col in dataframe.items():
    if isinstance(col,robjects.vectors.FactorVector) is True:
        colevel = tuple(col.levels)
        col = tuple(col)
        ncol = []
        for i in col:
            k=i-1
            ncol.append(colevel[k])
    else:
        ncol = tuple(col)
    col2data.append((cn,ncol))

col2data.append(('rownames',rownames))
col2data = dict(col2data)

输出是一个带有列名到值映射的dict。使用循环并转置列表列表将根据需要生成输出。