在data.table列中使用富对象

时间:2014-04-09 21:12:09

标签: r data.table

假设我有一个data.table,其中一列包含线性模型:

library(data.table)
set.seed(1014)

dt <- data.table(
  g = c(1, 1, 2, 2, 3, 3, 3),
  x = runif(7),
  y = runif(7)
)

models <- dt[, list(mod = list(lm(y ~ x, data = .SD))), by = g]

现在我想从每个模型中提取r平方值。我可不可以做 比这更好吗?

models[, list(rsq = summary(mod[[1]])$r.squared), by = g]

##    g      rsq
## 1: 1 1.000000
## 2: 2 1.000000
## 3: 3 0.004452

理想情况下,我希望能够消除[[1]]而不依赖 知道以前的分组变量(我知道我希望每一行都是 它自己的团队。)

4 个答案:

答案 0 :(得分:4)

这只是summary是一个糟糕的小函数,它不是矢量化的。那么如何手动矢量化(这与@ mnel的解决方案大致相同):

r.squared = Vectorize(function(x) summary(x)$r.squared)

models[, rsq := r.squared(mod)]
models
#   g  mod         rsq
#1: 1 <lm> 1.000000000
#2: 2 <lm> 1.000000000
#3: 3 <lm> 0.004451631

答案 1 :(得分:3)

我的第一个想法是使用rapplyclasses='lm',但这不起作用。 sapply然而(令我惊讶的是)

library(data.table)
set.seed(1014)

dt <- data.table(
  g = c(1, 1, 2, 2, 3, 3, 3),
  x = runif(7),
  y = runif(7)
)

models <- dt[, list(mod = list(lm(y ~ x, data = .SD))), by = g]
models[, rsq := sapply(mod, function(x) summary(x)$r.squared)]

models
#     g  mod         rsq
#  1: 1 <lm> 1.000000000
#  2: 2 <lm> 1.000000000
#  3: 3 <lm> 0.004451631

&#34;做其他事情&#34;因为data.table作为环境的方式,.SD中的模型可能会出现问题。

有关可能发生的情况的示例,请参阅Why is using update on a lm inside a grouped data.table losing its model data?。这是主题 虫子#2590

答案 2 :(得分:1)

那会有用吗?

library(data.table)
set.seed(1014)

dt <- data.table(
  g = c(1, 1, 2, 2, 3, 3, 3),
  x = runif(7),
  y = runif(7)
)
models <- dt[, list(rsq = summary(lm(y ~ x))$r.squared), by = g]
#   g         rsq
#1: 1 1.000000000
#2: 2 1.000000000
#3: 3 0.004451631

答案 3 :(得分:0)

我知道这个问题已经停用了两年多,但解决方案已经存在,此处不再赘述。

require(purrr)
require(broom)
map_df(models$mod, glance)