我正在为我拥有的某些数据绘制分位数 - 分位数图。我想只打印某些面板,这些面板满足我为panel.qq(x,y,...)设置的条件。
让我举个例子。以下是我的代码,
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.它再次感谢。
答案 0 :(得分:3)
是的,我认为这是一个子集问题,而不是lattice
问题。您没有包含示例,但看起来您只想保留数据框第2列中每个值超过3行的行。如果是这样,这是一个data.table
解决方案。
library(data.table)
test.dt <- as.data.table(test.df)
test.dt.subset <- test.dt[,N:=.N,by=c2][N>3]
c2
是第二列中的变量。最后一行代码首先为N
的每个值的行数(.N
)添加变量c2
,然后为N>3
添加子集。
更新:由于数据表也是数据框,因此您可以在test.dt.subset
(或其他qq
函数的调用中直接使用lattice
作为数据源。 / p>
更新2:这是一种在没有data.table
的情况下做同样事情的方法:
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
答案 1 :(得分:0)
我做了一件与DaveTurek非常相似的事情。 我上面的示例数据框是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()
希望这会有所帮助。