2013-07-19 22 views
8

Ho una matrice di 2 colonne. Gradirei il boxplot ciascuna di queste colonne, ma ognuna ha un numero diverso di voci.boxplot di vettori con lunghezza diversa

Ad esempio, la prima colonna ha 10 voci e la seconda colonna contiene 7 voci. I restanti 3 della seconda colonna sono dati zero.

Mi piacerebbe tracciare questi affiancati per ragioni di confronto.

C'è un modo per dire a R di inscatolare l'intera colonna 1 e solo la prima 7 per la colonna 2?

risposta

11

si potrebbe semplicemente indice i valori desiderati, per esempio

## dummy version of your data 
mat <- matrix(c(1:17, rep(0, 3)), ncol = 2) 

## create object suitable for plotting with boxplot 
## I.e. convert to melted or long format 
df <- data.frame(values = mat[1:17], 
       vars = rep(c("Col1","Col2"), times = c(10,7))) 

## draw the boxplot 
boxplot(values ~ vars, data = df) 

in quanto sopra ti sto prendendo in parola che avete una matrice. Se sussiste un frame di dati, allora si avrebbe bisogno

df <- data.frame(values = c(mat[,1], mat[1:7, 2]), 
       vars = rep(c("Col1","Col2"), times = c(10,7))) 

e assumere che i dati nelle due colonne sono comparabili in quanto il fatto che i valori sono in due colonne suggerisce una variabile categorica che ci permette di dividere i valori (come Altezza di uomini e donne, con il sesso come valore categoriale).

Il grafico a scatole risultante è mostrato sotto

enter image description here

+0

Grazie, è geniale. Per essere sicuro di aver capito bene, leggi tutto da 'mat' a 'valori' come un vettore. Quindi creare la variabile 'vars' con due colonne e 'times' dire 'vars' che il primo 10 appartiene a col1 e il successivo 7 appartiene a col2? Ho capito bene? – user1007742

+0

Non del tutto; Leggo solo i primi 17 valori da 'mat', ma hai riposi a destra. –

+0

Come posso fare questo a 3 vettori anziché a 2? – user1007742

2

Per qualsiasi numero di colonne e qualsiasi numero di voci vuote si può fare così.

## Load data from CSV; first row contains column headers 
dat <- read.csv('your-filename.csv', header = T) 

## Set plot region (when set 'ylim' skip first row with headers) 
plot(
    1, 1, 
    xlim=c(1,ncol(dat)), ylim=range(dat[-1,], na.rm=T), 
    xaxt='n', xlab='', ylab='' 
) 
axis(1, labels=colnames(dat), at=1:ncol(dat)) 

for(i in 1:ncol(dat)) { 
    ## Get i-th column 
    p <- dat[,i] 

    ## Remove 0 values from column 
    p <- p[! p %in% 0] 
    ## Instead of 0 you can use any values 
    ## For example, you can remove 1, 2, 3 
    ## p <- p[! p %in% c(1,2,3)] 

    ## Draw boxplot 
    boxplot(p, add=T, at=i) 
} 

Questo codice carica i file CSV sotto forma di tabella, rimuovere 0 valori dalla colonna (o è possibile rimuovere qualsiasi altro valore), e disegnare tutto boxplot per ogni colonna in un grafico.

Questo aiuta.

Problemi correlati