2015-11-29 4 views
14

R viene fornito con tre tipi per memorizzare elenchi di oggetti omogenei: vector, matrix e array.Quali sono le differenze tra i tipi di dati vettore, matrice e matrice?

Per quanto posso dire:

  • vector è casi particolari per 1 array dimensione
  • matrix è un caso speciale per 2 dimensioni array
  • array possono anche avere qualsiasi livello di dimensione (compreso 1 e 2).

Qual è la differenza tra l'utilizzo di array 1D su vettori e array 2D su matrici? Abbiamo bisogno di lanciarci tra quelli, o avverrà in modo automatico?

risposta

19

Non c'è differenza tra un matrix e 2D array:

> x <- matrix(1:10, 2) 
> y <- array(1:10, c(2, 5)) 
> identical(x, y) 
[1] TRUE 
... 

matrix è solo un costruttore più conveniente, e ci sono molte funzioni e metodi che accettano solo matrici 2D (note anche come matrici).

Internamente, gli array sono solo vettori con un attributo di dimensione:

... 
> attributes(x) 
$dim 
[1] 2 5 

> dim(x) <- NULL 
> x 
[1] 1 2 3 4 5 6 7 8 9 10 
> z <- 1:10 
> dim(z) <- c(2, 5) 
> is.matrix(z) 
[1] TRUE 

indicato lo language definition:

Matrici e array sono semplicemente vettori con l'attributo dim e opzionalmente dimnames attaccato al vettore.

[...]

L'attributo dim viene utilizzato per implementare array. Il contenuto dell'array è memorizzato in un vettore nell'ordine delle colonne e l'attributo è un vettore di numeri interi che specifica le rispettive estensioni dell'array . R assicura che la lunghezza del vettore sia il prodotto di delle lunghezze delle dimensioni. La lunghezza di una o più dimensioni potrebbe essere zero.

Un vettore non è la stessa di una matrice monodimensionale poiché l'ultimo ha un attributo dim di lunghezza uno, mentre il primo non ha un attributo dim luminoso .

+1

"... Gli array interni sono solo vettori ...". Che dire del fatto che la funzione di classe fornisce risultati diversi per vettori di vettori e di una dimensione? –

+0

Qual è la tua domanda? Esistono classi implicite in R. – Roland

+0

@Roland Forse dovresti modificare la tua risposta per includere questi dettagli di "ci sono classi implicite". Può essere utile avere una spiegazione esauriente su come usare funzioni come 'class()', 'mode()' e 'typeof()' per determinare alla fine la differenza tra vettori, matrici e matrici, ecc. – nbro