Ловушки в R для программистов Python

Я в основном программировал на Python, но теперь изучаю язык статистического программирования R. Я заметил некоторую разницу между языками, которые меня трогают.

Предположим, что v - это вектор/массив с целыми числами от 1 до 5 включительно.

v[3]  # in R: gives me the 3rd element of the vector: 3
      # in Python: is zero-based, gives me the integer 4
v[-1] # in R: removes the element with that index
      # in Python: gives me the last element in the array

Есть ли еще какие-то подводные камни, за которыми я должен следить?

Ответ 1

Написав десятки тысяч строк кода на обоих языках, R просто намного более своеобразен и менее последователен, чем Python. Это действительно приятно делать быстрые сюжеты и расследование по набору данных от малого до среднего размера, главным образом потому, что его встроенный объект DataFrame лучше, чем эквивалент numpy/scipy, но вы найдете все виды странности, поскольку делаете что-то более сложное, чем один лайнер. Мой совет - использовать rpy2 (у которого, к сожалению, намного худший интерфейс, чем его предшественник, rpy) и просто делайте как можно меньше в R с остальными в Python.

Например, рассмотрим следующий код матрицы:

> u = matrix(1:9,nrow=3,ncol=3)
> v = u[,1:2]
> v[1,1]
[2] 1
> w = u[,1]
> w[1,1]
Error in w[1, 1] : incorrect number of dimensions

Как это случилось? Причина в том, что если вы выберете подматрицу из матрицы, которая имеет только один столбец вдоль любой заданной оси, R "полезно" удаляет этот столбец и изменяет тип переменной. Таким образом, w представляет собой вектор целых чисел, а не матрицу:

> class(v)
[1] "matrix"
> class(u)
[1] "matrix"
> class(w)
[1] "integer"

Чтобы избежать этого, вам необходимо передать параметр скрытого ключевого слова:

> w2 = u[,1,drop=FALSE]
> w2[1,1]
[3] 1
> class(w2)
[1] "matrix"

Там много укромных уголков и трещин. Ваш лучший друг в начале будет интроспекцией и интерактивными инструментами помощи, такими как str, class, example и, конечно, help. Кроме того, обязательно посмотрите код примера в галерее R Graph и в Ripley Современная прикладная статистика с S-Plus книга.


EDIT: Здесь еще один отличный пример с факторами.

> xx = factor(c(3,2,3,4))
> xx
[1] 3 2 3 4
Levels: 2 3 4
> yy = as.numeric(xx)
> yy
[1] 2 1 2 3

Святая корова! Преобразование чего-то из коэффициента обратно в числовое значение фактически не делало преобразования, которое, по его мнению, было бы. Вместо этого он делает это на внутреннем перечислимом типе фактора. Это источник труднодоступных ошибок для людей, которые этого не знают, потому что они все еще возвращают целые числа и фактически фактически работают некоторое время (когда ввод уже численно упорядочен).

Это то, что вам действительно нужно делать

> as.numeric(levels(xx))[xx]
[1] 3 2 3 4

Да, конечно, этот факт находится на странице справки factor, но вы только приземляетесь туда, когда вы потеряли несколько часов до этой ошибки. Это еще один пример того, как R не делает то, что вы намерены. Будьте очень осторожны с тем, что связано с преобразованиями типов или доступа к элементам массивов и списков.

Ответ 2

Это не относится конкретно к фону Python vs. R, но R inferno - отличный ресурс для программистов, приезжающих в Р.

Ответ 3

Принятый ответ на этот пост, возможно, немного устарел. Pandas Библиотека Python теперь предоставляет потрясающую поддержку R-like DataFrame.

Ответ 4

Может быть... но прежде чем приступать к работе, вы попробовали некоторые из доступных расширений Python? Scipy имеет список.