rpy2:转换数据帧到一个纽比阵列

2024-10-01 15:43:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据帧它包含了大量的数据:来自许多(125)阵列的基因表达水平。我喜欢Python中的数据,主要是因为我在R方面的能力不足,而且这应该是一个30分钟的工作。在

我希望下面的代码工作。要理解这段代码,要知道变量path包含到我的数据集的完整路径,在加载时,它给了我一个名为immgen的变量。要知道immgen是一个对象(一个生物导体ExpressionSet对象),并且{}返回一个包含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()生成的数据帧,原因如下:

^{pr2}$

但谁知道呢?即使e代表我的数据帧,它不直接转换为数组就足够了——数据帧比数组(行名和列名)包含的内容更多,所以也许生活不应该这么简单。但是我还是不知道如何进行转换。文档对我来说有点过于简洁,尽管我对文档中标题的理解有限,这意味着这应该是可能的。在

有人有什么想法吗?在


Tags: 数据path对象代码importdataasnp
2条回答

为什么要经历数据帧当'exprs(immgen)'返回/matrix/并且您的最终目标是将数据保存在矩阵中?在

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

这将在简单性和效率上击败在平面文件中通过文本表示数字数据作为交换数据的方法的建议。在

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

这是我发现的将数据帧从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'之前,我将dataframe factor转换为integer(实际上是factor的底层数据类型),这可能是最简单的方法。在

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

^{pr2}$

相关问题 更多 >

    热门问题