7

我在 R 中有一个 data.frame。它包含很多数据:来自许多 (125) 数组的基因表达水平。我想要 Python 中的数据,主要是因为我在 R 方面的无能以及这应该是一个 30 分钟的工作。

我希望以下代码能够工作。要理解此代码,请知道该变量path包含我的数据集的完整路径,加载时会为我提供一个名为immgen. 知道这immgen是一个对象(一个 BioconductorExpressionSet对象),它exprs(immgen)返回一个包含 125 列(实验)和数万行(命名基因)的数据框。(以防万一不清楚,这是Python代码,使用robjects.r调用R代码)

import numpy as np
import rpy2.robjects as robjects
# ... some code to build path
robjects.r("load('%s')"%path) # loads immgen
e = robjects.r['data.frame']("exprs(immgen)")
expression_data = np.array(e)

此代码运行,但expression_data只是array([[1]]).

我很确定这e并不代表由于以下exprs()原因生成的数据框:

In [40]: e._get_ncol()
Out[40]: 1

In [41]: e._get_nrow()
Out[41]: 1

但话说回来,谁知道呢?即使e确实代表了我的 data.frame,它不会直接转换为数组也足够公平 - 数据框比数组(行名和列名)包含更多,所以也许生活不应该这么容易。但是我仍然无法弄清楚如何执行转换。文档对我来说有点太简洁了,尽管我对文档标题的有限理解意味着这应该是可能的。

有人有什么想法吗?

4

2 回答 2

7

这是我发现将数据帧从 R 传输到 Python 的最直接和最可靠的方法。

首先,我认为通过 R 绑定交换数据是不必要的复杂化。R 提供了一种简单的方法来导出数据,同样,NumPy 也有不错的数据导入方法。文件格式是这里唯一需要的通用接口。

data(iris)
iris$Species = unclass(iris$Species)

write.table(iris, file="/path/to/my/file/np_iris.txt", row.names=F, sep=",")

# now start a python session
import numpy as NP

fpath = "/path/to/my/file/np_iris.txt"

A = NP.loadtxt(fpath, comments="#", delimiter=",", skiprows=1)

# print(type(A))
# returns: <type 'numpy.ndarray'>

print(A.shape)
# returns: (150, 5)

print(A[1:5,])
# returns: 
 [[ 4.9  3.   1.4  0.2  1. ]
  [ 4.7  3.2  1.3  0.2  1. ]
  [ 4.6  3.1  1.5  0.2  1. ]
  [ 5.   3.6  1.4  0.2  1. ]]

根据文档(以及我自己的价值经验),loadtxt是常规数据导入的首选方法。

您还可以向loadtxt传递一个数据类型的元组(参数是dtypes),元组中每列的一个项目。注意 'skiprows=1' 跳过列标题(因为loadtxt行从 1 开始索引,列从 0 开始索引)。

最后,我在导出之前将数据帧因子转换为整数(实际上是因子的底层数据类型)——“unclass”可能是最简单的方法。

如果你有大数据(即不想将整个数据文件加载到内存中但仍需要访问它) NumPy 的内存映射数据结构('memmap')是一个不错的选择:

from tempfile import mkdtemp
import os.path as path

filename = path.join(mkdtemp(), 'tempfile.dat')

# now create a memory-mapped file with shape and data type 
# based on original R data frame:
A = NP.memmap(fpath, dtype="float32", mode="w+", shape=(150, 5))

# methods are ' flush' (writes to disk any changes you make to the array), and 'close'
# to write data to the memmap array (acdtually an array-like memory-map to 
# the data stored on disk)
A[:] = somedata[:]
于 2010-04-19T18:32:01.093 回答
4

当'exprs(immgen)'返回/matrix/并且您的最终目标是将数据放入矩阵时,为什么要通过data.frame?

将矩阵传递给 numpy 很简单(甚至可以在不制作副本的情况下制作): http ://rpy.sourceforge.net/rpy2/doc-2.1/html/numpy.html#from-rpy2-to-numpy

这在简单性和效率上都应该优于通过平面文件中数字数据的文本表示作为交换数据的方式的建议。

您似乎正在使用生物导体类,并且可能对以下内容感兴趣:http: //pypi.python.org/pypi/rpy2-bioconductor-extensions/

于 2010-04-20T08:19:46.353 回答