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.
'v [3]' en pitón le da cuarto elemento de una secuencia. en el caso dado que sería '4'. – SilentGhost
@SilentGhost: fuera de curso, corrigió el error. – BioGeek
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