Ловушки в 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 

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

Написав десятки тысяч строк кода на обоих языках, 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 не делает то, что вы намерены. Будьте очень осторожны с тем, что связано с преобразованиями типов или доступа к элементам массивов и списков.

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

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

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