[R] store list objects in data.table

Bert Gunter bgunter@4567 @end|ng |rom gm@||@com
Sun Sep 22 08:00:57 CEST 2024


Well, you may have good reasons to do things this way -- and you
certainly do not have to explain them here.

But you might wish to consider using R's poly() function and a basic
nested list structure to do something quite similar that seems much
simpler to me, anyway:

x <- rnorm(20)
df <- data.frame(x = x, y = x + .1*x^2 + rnorm(20, sd = .2))
result <-
   with(df,
          lapply(1:2, \(i)
                 list(
                     degree = i, reg =lm(y ~ poly(x, i, raw = TRUE))
                    )
          )
   )

As you can see, 'result' is a list, each component of which is a list
of two with names "degree" and "reg" giving the same info as each row
of your 'mydt'. You can use lapply() and friends to access these
results and fiddle with them as you like, such as: "extract the
coefficients from the second degree fits only", and so forth. Also
note that individual components of nested lists can be extracted by
giving a vector to [[ instead of repeated [['s. For example:
result[[2]][[2]]  ## the reg component of the degree 2 polynomial
## is the same as
result[[c(2,2)]] ## this is a bit easier for me to groc.

Again, feel free to ignore without replying if my gratuitous remarks
are unhelpful.

Cheers,
Bert


On Sat, Sep 21, 2024 at 2:25 PM Naresh Gurbuxani
<naresh_gurbuxani using hotmail.com> wrote:
>
> I am trying to store regression objects in a data.table
>
> df <- data.frame(x = rnorm(20))
> df[, "y"] <- with(df, x + 0.1 * x^2 + 0.2 * rnorm(20))
>
> mydt <- data.table(mypower = c(1, 2), myreg = list(lm(y ~ x, data = df),
> lm(y ~ x + I(x^2), data = df)))
>
> mydt
> #   mypower    myreg
> #     <num>   <list>
> #1:       1 <lm[12]>
> #2:       2 <lm[12]>
>
> But mydt[1, 2] has only the coeffients of the first regression. mydt[2,
> 2] has residuals of the first regression.  These are the first two
> components of "lm" object.
>
> mydt[1, myreg[[1]]]
> #(Intercept)           x
> #   0.107245    1.034110
>
> Is there a way to put full "lm" object in each row?
>
> Thanks,
> Naresh
>
> ______________________________________________
> R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide https://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.



More information about the R-help mailing list