<div dir="ltr">Wow, thx!  I didn't think it would be straightforward - but to your point I will try to set up my data differently to see if I can simplify the process.</div><div class="gmail_extra"><br><br><div class="gmail_quote">
On Tue, Aug 6, 2013 at 5:45 PM, Steve Lianoglou <span dir="ltr"><<a href="mailto:mailinglist.honeypot@gmail.com" target="_blank">mailinglist.honeypot@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hi John,<br>
<br>
(resending because I was bounced from list due to sending from wrong<br>
email address)<br>
<br>
Please use "reply-all" when replying to emails on this list so that<br>
discussion stays "on list" and others can help with and benefit from<br>
the discussion.<br>
<br>
Comments below:<br>
<br>
On Aug 6, 2013, at 2:40 PM, John Kerpel <<a href="mailto:john.kerpel2@gmail.com">john.kerpel2@gmail.com</a>> wrote:<br>
<br>
> Steve:<br>
><br>
> To follow up on my question from a couple of days ago, assuming the<br>
> following:<br>
<br>
> DT = data.table(a=c(4:13),y=c(1,1,2,2,2,3,3,3,4,4),x=1:10,z=c(1,1,1,1,2,2,2,2,3,3),zz=c(1,1,1,1,1,2,2,2,2,2))<br>
> setkeyv(DT,cols=c("a","x","y","z","zz"))<br>
> #DT[,if(.N>=4) {list(predict(smooth.spline(x,y),a)$y)} ,by=c('z', 'zz')]<br>
><br>
> a=c(4:13)<br>
> y=c(1,1,2,2,2,3,3,3,4,4)<br>
> x=1:10<br>
> predict(smooth.spline(x[1:4],y[1:4]),a[1:5])$y<br>
> [1] 2.1 2.5 2.9 3.3 3.7<br>
> predict(smooth.spline(x[5:8],y[5:8]),a[6:10])$y<br>
> [1] 2.954664 2.909333 2.864003 2.818672 2.773341<br>
<br>
> So in this example the predictor a is indexed by zz and (x,y) is indexed by<br>
> z.  Is there a way to do this in the "by" statement?  I've got a workaround<br>
> that uses clusterMap, but I'd like to use data.table instead via some<br>
> statement like what is commented out above.<br>
<br>
> Thanks for your help.<br>
<br>
This seems like the data is setup in a rather strange way -- you'd<br>
like to have objects (smooth splines) predict on elements (the `a`s)<br>
that are trained on different sets that you want to predict .. there's<br>
no "natural" way to use the same data for training and prediction by<br>
iterating over subsets at the same time.<br>
<br>
Perhaps you provided a toy example which isn't how your real data is<br>
set up, but if not, I'd recommend perhaps having two different tables<br>
(one with your zz's and your z's split), eg:<br>
<br>
train <- data.table(x=whatever, y=whatever, z=z-index)<br>
predict.on <- data.table(a=a.values, z=z-index)<br>
<br>
Anyway, I'll just leave the code that uses data.table with your<br>
current data below with no further comment -- it'll do what you want.<br>
<br>
library(data.table)<br>
<br>
a <- c(4:13)<br>
y <- c(1,1,2,2,2,3,3,3,4,4)<br>
x <- 1:10<br>
z <- c(1,1,1,1,2,2,2,2,3,3)<br>
zz <- c(1,1,1,1,1,2,2,2,2,2)<br>
DT <- data.table(a=a, y=y, x=x, z=z, zz=zz)<br>
setkeyv(DT, 'z')<br>
Zs <- unique(DT)$z<br>
<br>
splines <- lapply(Zs, function(zval) {<br>
 dt <- DT[J(zval)]<br>
 if (nrow(dt) >= 4) {<br>
   ss <- smooth.spline(dt$x, dt$y)<br>
 } else {<br>
   ss <- NULL<br>
 }<br>
 data.table(zz=zval, ss=list(ss), is.spline=!is.null(ss))<br>
})<br>
splines <- rbindlist(splines)[is.spline == TRUE]<br>
setkeyv(splines, 'zz')<br>
setkeyv(DT, 'zz')<br>
<br>
splines[DT, list(preds=predict(ss[[1]], a)$y)]<br>
    zz    preds<br>
 1:  1 2.100000<br>
 2:  1 2.500000<br>
 3:  1 2.900000<br>
 4:  1 3.300000<br>
 5:  1 3.700000<br>
 6:  2 2.954664<br>
 7:  2 2.909333<br>
 8:  2 2.864003<br>
 9:  2 2.818672<br>
10:  2 2.773341<br>
<br>
HTH,<br>
-steve<br>
</blockquote></div><br></div>