2013-07-19 35 views
8

Tôi có ma trận gồm 2 cột. Tôi muốn boxplot mỗi cột này nhưng mỗi cột có số lượng mục khác nhau.ô mẫu của vectơ có độ dài khác nhau

Ví dụ: cột đầu tiên có 10 mục nhập và cột thứ hai có 7 mục nhập. 3 còn lại của cột thứ hai được cho không.

Tôi muốn vẽ các mặt này cạnh nhau vì các lý do so sánh.

Có cách nào để yêu cầu R đóng hộp toàn bộ cột 1 và chỉ mục nhập 7 đầu tiên cho cột 2 không?

Trả lời

11

Bạn có thể chỉ đơn giản là chỉ số giá trị bạn muốn, ví dụ

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

Ở phía trên tôi đưa bạn vào văn bản của bạn rằng bạn có một ma trận. Nếu bạn thực sự có một khung dữ liệu sau đó bạn sẽ cần

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

và tôi cho rằng các dữ liệu trong hai cột có thể so sánh ở chỗ thực tế là các giá trị trong hai cột cho thấy một biến phân loại cho phép chúng ta chia các giá trị (như Chiều cao của nam và nữ, với giới tính là giá trị phân loại).

Các boxplot kết quả được hiển thị dưới đây

enter image description here

+0

Cảm ơn điều đó thật tuyệt vời. Chỉ để đảm bảo tôi hiểu đúng, bạn đọc mọi thứ từ 'mat' thành 'các giá trị' như một vectơ. Sau đó, tạo biến 'vars' với hai cột và 'lần' cho 'vars' mà 10 đầu tiên thuộc về col1 và 7 lần tiếp theo thuộc về col2? Tôi đã làm đúng chứ? – user1007742

+0

Không hoàn toàn; Tôi chỉ đọc 17 giá trị đầu tiên từ 'mat', nhưng bạn có quyền nghỉ ngơi. –

+0

Làm cách nào tôi có thể thực hiện việc này với 3 vectơ thay vì 2? – user1007742

2

Đối với bất kỳ số lượng các cột và bất kỳ số lượng các mục rỗng, bạn có thể làm như thế này.

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

Mã này tải tệp CSV biểu mẫu bảng, xóa 0 giá trị khỏi cột (hoặc bạn có thể xóa bất kỳ giá trị nào khác) và vẽ tất cả các ô cho mỗi cột trong một hình ảnh.

Suy nghĩ điều này sẽ hữu ích.

Các vấn đề liên quan