Это самый простой и надежный способ передачи фрейма данных из 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[:]