vacio studio seleccionar recodificar matrices filtrar filas eliminar datos crear comandos columnas r matrix

studio - seleccionar columnas en r



¿La mejor forma de asignar matriz en R, NULL vs NA? (3)

De acuerdo con este artículo , podemos hacer algo mejor que la preasignación con NA al realizar una NA_real_ con NA_real_ . Del artículo:

tan pronto como asigne un valor numérico a cualquiera de las celdas en ''x'', la matriz primero tendrá que ser coercitiva a numérica cuando se le asigne un nuevo valor. La matriz lógica asignada originalmente se asignó en vano y solo agrega una huella de memoria innecesaria y trabajo adicional para el recolector de basura. En lugar de asignarlo usando NA_real_ (o NA_integer_ para enteros)

Como se recomienda: probémoslo.

testfloat = function(mat){ n=nrow(mat) for(i in 1:n){ mat[i,] = 1.2 } } >system.time(testfloat(matrix(data=NA,nrow=1e4,ncol=1e4))) user system elapsed 3.08 0.24 3.32 > system.time(testfloat(matrix(data=NA_real_,nrow=1e4,ncol=1e4))) user system elapsed 2.91 0.23 3.14

Y para enteros:

testint = function(mat){ n=nrow(mat) for(i in 1:n){ mat[i,] = 3 } } > system.time(testint(matrix(data=NA,nrow=1e4,ncol=1e4))) user system elapsed 2.96 0.29 3.31 > system.time(testint(matrix(data=NA_integer_,nrow=1e4,ncol=1e4))) user system elapsed 2.92 0.35 3.28

La diferencia es pequeña en mis casos de prueba, pero está ahí.

Estoy escribiendo código R para crear una matriz cuadrada. Entonces mi enfoque es:

  1. Asigne una matriz del tamaño correcto
  2. Pasa por cada elemento de mi matriz y llénalo con un valor apropiado

Mi pregunta es realmente simple: ¿cuál es la mejor manera de preasignar esta matriz? Hasta ahora, tengo dos formas:

> x <- matrix(data=NA,nrow=3,ncol=3) > x [,1] [,2] [,3] [1,] NA NA NA [2,] NA NA NA [3,] NA NA NA

o

> x <- list() > length(x) <- 3^2 > dim(x) <- c(3,3) > x [,1] [,2] [,3] [1,] NULL NULL NULL [2,] NULL NULL NULL [3,] NULL NULL NULL

Por lo que puedo ver, el primero es un método más conciso que el segundo. Además, el primero llena la matriz con NA, mientras que el segundo está lleno de NULL.

¿Cuál es la "mejor" forma de hacer esto? En este caso, estoy definiendo "mejor" como "mejor desempeño", porque esto es computación estadística y esta operación se llevará a cabo con grandes conjuntos de datos.

Mientras que el primero es más conciso, no es sorprendentemente más fácil de entender, por lo que siento que esto podría ir en cualquier dirección.

Además, ¿cuál es la diferencia entre NA y NULL en R? ? NA y? NULL me dicen que "NA" tiene una longitud de "1" mientras que NULL tiene una longitud de "0" - pero, ¿hay más aquí? ¿O una mejor práctica? Esto afectará qué método utilizo para crear mi matriz.


En caso de duda, pruébate. El primer enfoque es más fácil y más rápido.

> create.matrix <- function(size) { + x <- matrix() + length(x) <- size^2 + dim(x) <- c(size,size) + x + } > > system.time(x <- matrix(data=NA,nrow=10000,ncol=10000)) user system elapsed 4.59 0.23 4.84 > system.time(y <- create.matrix(size=10000)) user system elapsed 0.59 0.97 15.81 > identical(x,y) [1] TRUE

En cuanto a la diferencia entre NA y NULL:

En realidad, hay cuatro constantes especiales.

Además, hay cuatro constantes especiales, NULL, NA, Inf y NaN.

NULL se usa para indicar el objeto vacío. NA se utiliza para valores de datos ausentes ("No disponible"). Inf denota infinito y NaN no es un número en el cálculo de punto flotante IEEE (resultados de las operaciones respectivamente 1/0 y 0/0, por ejemplo).

Puede leer más en el manual de R sobre la definición de idioma .


rows<-3 cols<-3 x<-rep(NA, rows*cols) x1 <- matrix(x,nrow=rows,ncol=cols)