2011-01-01 17 views
13

He programado principalmente en Python, pero ahora estoy aprendiendo el lenguaje de programación estadística R. He notado cierta diferencia entre los lenguajes que tienden a hacerme tropezar.Errores en R para programadores de Python

Supongamos que v es un vector/matriz con los números enteros del 1 al 5 inclusive.

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 

¿Hay alguna otra falla que deba vigilar?

+2

'v [3]' en pitón le da cuarto elemento de una secuencia. en el caso dado que sería '4'. – SilentGhost

+0

@SilentGhost: fuera de curso, corrigió el error. – BioGeek

+2

El título no representa exactamente la pregunta aquí: estos no son "peligros en R", son solo diferencias básicas entre dos idiomas diferentes. Y de todos modos, v [-1] no "elimina el elemento" con el índice 1, devuelve un nuevo vector con cada elemento excepto el primero. – mdsumner

Respuesta

16

Habiendo escrito decenas de miles de líneas de código en ambos idiomas, R es simplemente mucho más idiosincrásico y menos consistente que Python. Es realmente bueno hacer tramas e investigaciones rápidas en un conjunto de datos de tamaño pequeño a mediano, principalmente porque su objeto de marco de datos integrado es más bonito que el equivalente numpy/scipy, pero encontrarás todo tipo de rarezas a medida que haces cosas más complicadas que uno liners. Mi consejo es usar rpy2 (que lamentablemente tiene una interfaz de usuario mucho peor que su predecesor, rpy) y hacer lo menos posible en R con el resto en Python.

Por ejemplo, consideremos el siguiente código de la matriz:

> 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 

¿Cómo que no? El motivo es que si selecciona una submatriz de una matriz que tiene solo una columna a lo largo de un eje determinado, R "amablemente" descarta esa columna y cambia el tipo de la variable. Así que w es un vector de enteros en lugar de una matriz:

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

Para evitar esto, es necesario pasar realmente un parámetro clave extrañas:

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

Hay un montón de rincones y grietas por el estilo. Su mejor amigo al principio será la introspección y herramientas de ayuda en línea como str, class, example, y por supuesto help. Además, asegúrese de mirar el código de ejemplo en el R Graph Gallery y en el libro de Ripley Modern Applied Statistics with S-Plus.


EDITAR: Este es otro gran ejemplo con factores.

> 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 

Holy cow! Convertir algo de un factor a un valor numérico no hizo la conversión que creías que sería. En cambio, lo hace en el tipo interno enumerado del factor. Esta es una fuente de errores difíciles de encontrar para las personas que no están al tanto de esto, porque todavía está volviendo enteros y de hecho realmente funcionará algunos del tiempo (cuando la entrada ya está ordenada numéricamente).

Esto es lo que realmente necesita hacer

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

Sí, claro, ese hecho es en la página factor ayuda, pero sólo aterrizar allí cuando se ha perdido un par de horas a este error. Este es otro ejemplo de cómo R no hace lo que pretende. Tenga mucho cuidado con cualquier cosa que implique conversiones de tipo o acceda a elementos de matrices y listas.

+3

+1. Dios, odio ese 'drop = TRUE' predeterminado. – fabians

+0

Lo siento, pero eso es especialmente una opinión personal. De hecho, no puede contentarse con algunos valores predeterminados, o encontrarlo "menos idiosincrásico", pero para lo que está diseñado, R supera a Python en mi propia opinión personal. Me acabo de acostumbrar a cómo funciona R, y como generalmente seleccionas una fila o columna de una matriz para hacer un cálculo ** vectorizado ** en ella, el drop = T predeterminado no es tan poco lógico. –

+0

Bueno, claro, pero puedes multiplicar una matriz n x 1 tan bien como puedes con un vector n de longitud. No hay ninguna razón para forzar una conversión de tipo. De todos modos, vamos a decir que esto no es el comportamiento en cualquier otra biblioteca para el lenguaje de matriz (incluyendo numpy) y es, por tanto, relevante para el autor pregunta original re: trampas :) – ramanujan

1

Puede haber ... pero antes de embarcarse, ¿ha probado alguna de las extensiones de Python disponibles? Scipy tiene una lista.

14

Esto no es abordar específicamente el Python vs R fondo, pero el R inferno es un gran recurso para los programadores que vienen a R.

+3

+1 para el puntero R Infierno - una gran referencia para R "trampas" –

7

La respuesta aceptada para este post es, posiblemente, un poco anticuado. La biblioteca de Python Pandas ahora ofrece una increíble compatibilidad con DataFrame tipo R.

Cuestiones relacionadas