2015-03-31 52 views
1

我有一個很大的數據框df,它包含非唯一標識(Cell.ID)列表和該標識中的信息。它看起來是這樣的:僅從包含所有值的數據幀繪製上量子

Cell.ID Volume 
1 025001G 2.08 
2 025001G 0.30 
3 025001G 0.99 
4 025001G 0.60 
5 025001G 0.43 
6 025001G 0.24 
7 025001G 0.59 
8 025001R 1.74 
9 025001R 1.09 
10 025001R 0.58 
11 025001R 0.75 
12 025001R 0.62 
13 025002G 8.59 
14 025002G 1.26 
15 025002R 6.31 
16 025002R 0.56 
17 025003G 1.95 
18 025003G 2.18 
19 025003G 0.21 

我想這樣做的是使在Y軸對應於音量和X座標對應於特定Cell.ID.的實例數的積這部分很簡單,但我希望每個對象的Y座標既可以是跨越上兩個分位數的框,也可以是代表第二高分位數的點。使用tapply(df$Volume,quantile)table(df$Cell.ID)我能夠創建一個如下所示的數據框,其中包含製作所述圖的必要信息。 Freq包含特定Cell.ID(行名稱)出現次數的信息,Quantile包含有關該Cell.ID中對象的卷分佈的信息。

row.names  quantile      Var1  Freq 
1 010001G c(0.27, 0.27, 0.325, 0.6125, 1.31) 010001G 4 
2 010001R c(0.22, 0.365, 0.51, 0.655, 0.8)  010001R 2 
3 010002G c(0.67, 0.8025, 0.935, 1.0675, 1.2) 010002G 2 
4 010002R c(0.25, 0.41, 0.57, 0.73, 0.89)  010002R 2 
5 010003G c(0.22, 0.295, 0.345, 0.3725, 0.38) 010003G 4 
6 010003R c(0.22, 0.2675, 0.315, 0.3625, 0.41) 010003R 2 
7 010004G c(0.35, 0.41, 0.625, 1.165, 2.2)  010004G 4 
8 010004R c(0.2, 0.4075, 0.615, 0.8225, 1.03) 010004R 2 
9 010005G c(3.95, 3.95, 3.95, 3.95, 3.95)  010005G 1 
10 010005R c(0.47, 0.775, 1.08, 2.53, 3.98)  010005R 3 
11 010006G c(0.25, 0.98, 1.71, 2.98, 4.25)  010006G 3 

但是我堅持如何從分位列中選擇每行只有某些分位數來繪圖。我已經嘗試了一些東西,但得到的錯誤,像這樣的:

Error in xy.coords(x, y, xlabel, ylabel, log) : 
    'x' is a list, but does not have components 'x' and 'y 
+0

什麼將你的條件,定義某些分位數?什麼給了你最後陣列? – vrajs5 2015-03-31 08:33:50

回答

1

如果我理解你的問題正確,你並不需要所有的分位數,只有一個或兩個。所以,你可以嘗試這樣的事情:

Q75 <- tapply(df$Volume, df$Cell.ID, quantile, probs = 0.75) 
freq <- table(df$Cell.ID) 
plot(x = as.vector(freq), y = Q75, 
    xlab = "Frequency", ylab = "75th Quantile") 

或爲第75和第95位數:

Q7595 <- do.call(rbind.data.frame, 
       tapply(df$Volume, df$Cell.ID, quantile, 
         probs = c(0.75, 0.95), simplify = TRUE)) 
## Empty plot 
matplot(x = as.vector(freq), y = Q7595, type = "n", 
     xlab = "Frequency", ylab = "75th and 95th Quantiles") 
## Boxes 
rect(xleft = as.vector(freq) - 0.25, xright = as.vector(freq) + 0.25, 
    ytop = Q7595[,1], ybottom = Q7595[,2]) 

結果看起來像這樣: enter image description here

當然它需要一些審美的變化,但我希望它有幫助, alex

+1

非常感謝!我沒有意識到它會像指定哪個百分點一樣直截了當,我一直認爲我必須與數組一起工作。 – 2015-03-31 15:38:04

+0

你也可以這樣做,但最好只計算你需要的東西。 – alko989 2015-03-31 15:44:01

相關問題