2013-07-19 14 views
8

Mam matrycę 2 kolumn. Chciałbym boxplot dla każdej z tych kolumn, ale każda ma inną liczbę wpisów.Boxplot wektorów o różnej długości

Na przykład pierwsza kolumna ma 10 pozycji, a druga kolumna ma 7 pozycji. Pozostałe 3 drugiej kolumny otrzymuje zero.

Chciałbym wykreślić te strony obok siebie ze względów porównawczych.

Czy istnieje sposób na powiedzenie R, aby umieścić całą kolumnę 1 i tylko pierwsze 7 pozycji w kolumnie 2?

Odpowiedz

11

Można było po prostu wskaźnik wartości chcesz, na przykład

## 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) 

w powyższym Biorę cię za słowo, że masz matrycę. Jeśli rzeczywiście mają ramkę danych wtedy trzeba

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

i zakładam, że dane w dwóch kolumnach są porównywalne z tym, że fakt, że wartości są w dwóch kolumnach sugeruje kategoryczny zmienną, która pozwala nam podzielić wartości (np. Wysokość mężczyzn i kobiet, przy czym płeć jest wartością kategoryczną).

Powstały boxplot przedstawiono poniżej

enter image description here

+0

Dzięki, że jest genialny. Aby upewnić się, że wszystko jest w porządku, czytasz wszystko od "maty" do "wartości" jako wektora. Następnie utwórz zmienną 'vars' z dwiema kolumnami, a 'times' powiedz 'vars', że pierwsze 10 należy do col1, a następne 7 należy do col2? Czy dobrze to rozumiem? – user1007742

+0

Niezupełnie; Czytałem tylko pierwsze 17 wartości z "mat", ale masz odpowiedni odpoczynek. –

+0

Jak mogę to zrobić dla 3 wektorów zamiast 2? – user1007742

2

dla dowolnej liczby kolumn i dowolnej liczby pustych wpisów można zrobić w ten sposób.

## 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) 
} 

Ładuje kod postaci tablicy plików CSV, usuń 0 wartości z kolumny (lub można usunąć wszelkie inne wartości) i wyciągnąć cały wykres typu boxplot dla każdej kolumny w jednej grafice.

Pomaga to.

Powiązane problemy