仅打印R晶格中的某些面板

时间:2015-04-20 13:27:53

标签: r lattice

我正在为我拥有的某些数据绘制分位数 - 分位数图。我想只打印某些面板,这些面板满足我为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.它再次感谢。

2 个答案:

答案 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()

希望这会有所帮助。

相关问题