gpt4 book ai didi

python - rpy2:将 data.frame 转换为 numpy 数组

转载 作者:太空狗 更新时间:2023-10-29 21:32:57 24 4
gpt4 key购买 nike

我在 R 中有一个 data.frame。它包含大量数据:来自许多 (125) 个数组的基因表达水平。我想要 Python 中的数据,主要是因为我不擅长 R,而且这应该是一项 30 分钟的工作。

我希望下面的代码能够工作。要理解此代码,请知道变量 path 包含我的数据集的完整路径,加载时会给我一个名为 immgen 的变量。知道 immgen 是一个对象(一个 Bioconductor ExpressionSet 对象)并且 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,它不会直接转换为数组也足够公平 - 数据帧比数组(rownames 和 colnames)包含更多,所以也许生活不应该这么容易。但是我仍然不知道如何执行转换。该文档对我来说有点过于简洁,尽管我对文档中标题的有限理解意味着这应该是可能的。

大家有什么想法吗?

最佳答案

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

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

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[:]

关于python - rpy2:将 data.frame 转换为 numpy 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2669427/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com