2015-04-20 24 views
0

我正在繪製某個數據的分位數分位數圖。我只想打印滿足我爲panel.qq(x,y,...)放置的條件的某些面板。僅在R格子中打印某些面板

讓我給你舉個例子。以下是我的代碼:

qq(y ~ x|cond,data=test.df,panel=function(x,y,subscripts,...){ 
    if(length(unique(test.df[subscripts,2])) > 3){panel.qq(x,y,subscripts,...})}) 

這裏y是因子,x是將在X軸和y軸上繪製的變量。 Cond是條件變量。我想要的是,只打印那些通過面板功能條件的面板,這是

if(length(unique(test.df[subscripts,2])) > 3). 

我希望這個信息有幫助。提前致謝。

加樣品數據,

 y  x cond 
1  1  6 125 
2  2  5 125 
3  1  5 125 
4  2  6 125 
5  1  3 125 
6  2  8 125 
7  1  8 125 
8  2  3 125 
9  1  5 125 
10  2  6 125 
11  1  5 124 
12  2  6 124 
13  1  6 124 
14  2  5 124 
15  1  5 124 
16  2  6 124 
17  1  4 124 
18  2  7 124 
19  1  0 123 
20  2  11 123 
21  1  0 123 
22  2  11 123 
23  1  0 123 
24  2  11 123 
25  1  0 123 
26  2  11 123 
27  1  0 123 
28  2  2 123 

所以這是樣本數據。我想要的是沒有123的面板,因爲123的唯一值的數量是3,而其他的是4.再次感謝。

+3

爲什麼你不只是數據的子集並將其傳遞給繪圖函數呢? – PavoDive

+0

@PavoDive,這是我想嘗試的東西,但現在數據值的行爲還不完全可見。如果我要理解這種行爲,我可以輕鬆地對數據進行子集化。截至目前我所瞭解的是,數據有兩種類型,一種不具有多個值,另一種具有。這不是我數據值的內在行爲,而是數據本身。而且因爲在這個時候我不能區分,所以我沒有對數據進行描述。 – Bartha

+0

巴爾塔,我還不確定爲什麼@PavoDive的建議不是一個好的選擇。我最近一直沒有使用面板函數,我不確定'subscripts'是指什麼,但是可以使用任意複雜的條件對數據框進行子集化。所以你可以使用類似這樣的東西:'data = test.df [length(unique(test.df [subscripts,2]))> 3,]'。 (注意最後的逗號。)你需要用其他東西來替換下標。我相信下標是指行索引,我不知道如何替換它。所以這不是一個答案,但它應該指向一個答案。 – Mars

回答

3

是的,我認爲這是一個子集問題,而不是一個lattice之一。您不包括一個示例,但它看起來像只保留行數超過3行的數據框中第2列的每個值。如果是這樣,這裏是一個data.table解決方案。

library(data.table) 
test.dt <- as.data.table(test.df) 
test.dt.subset <- test.dt[,N:=.N,by=c2][N>3] 

其中c2是第二列中的變量。代碼的最後一行首先爲每個值c2的行數(.N)添加變量N,然後爲N>3添加子集。

更新:由於數據表也是一個數據框,您可以直接使用test.dt.subset作爲調用qq(或其他lattice函數)中的數據源。

更新2:這裏是做同樣的事情,而不data.table一個辦法:我確實非常相似,DaveTurek東西

d <- data.frame(x=1:15,y=1:15%%2, # example data frame 
     c2=c(1,2,2,3,3,3,4,4,4,4,5,5,5,5,5)) 

d$N <- 1 # create a column for count 
split(d$N,d$c2) <- lapply(split(d$x,d$c2),length) # populate with count 
d 
d[d$N>3,] # subset 
0

。 上面我的示例數據幀是test.df

test.df.list <- split(test.df,test.df$cond,drop=F) 
final.test.df <- do.call("rbind",lapply(test.df.list,function(r){ 
if(length(unique(r$x)) > 3){r}}) 

所以,我在這裏打破了test.df由調節變量data.frames的列表。接下來,在lapply中,我檢查每個子集數據框中的唯一值的數量。如果這個數字大於3,那麼如果不被忽略,則數據幀被給出/收回。接下來,一個do.call將所有的dfs綁定回一個大的df來運行分位數分位數圖。 如果有人想知道獲得特定數據後的qq函數調用。那麼它是,

trellis.device(postscript,file="test.ps",color=F,horizontal=T,paper='legal') 
qq(y ~ x|cond,data=final.test.df,layout=c(1,1),pch=".",cex=3) 
dev.off() 

希望這會有所幫助。