在 data.table 中使用 lapply 从列表列中提取元素

Using lapply in data.table to extract element from a list column

我将 lm 摘要列表与 data.table 合并。 接下来,我从摘要中提取一个系数并生成一个包含该数字的新列。 我的问题是,为什么我必须使用lapply来完成这样的工作?
例如,以下代码有效。

new.DT <- old.DT[, result := lapply(X = results.of.lm, FUN = summary)] %>%
  .[, beta := lapply(X = result, function(x) x$coefficients[2,1])] 

虽然下面的代码失败了。

new.DT <- old.DT[, result := lapply(X = results.of.lm, FUN = summary)] %>% 
.[, beta := result$coefficients[2,1])] 

但是,对于我应用于 data.table 中的列的某些函数(例如粘贴、substr 或 as.numeric),lapply 不是必需的。 我无法弄清楚是什么导致了这种差异。谢谢!

假设 old.DT 看起来像这样:

   grp results.of.lm
1:   1      <lm[12]>
2:   2      <lm[12]>
3:   3      <lm[12]>

然后,在使用 old.DT[, result:=lapply(results.of.lm,summary)] 创建结果列后,我们注意到 result 是列表的列表

   grp results.of.lm           result
1:   1      <lm[12]> <summary.lm[11]>
2:   2      <lm[12]> <summary.lm[11]>
3:   3      <lm[12]> <summary.lm[11]>

请注意 old.DT$result$coefficients 为 NULL,因此 beta:=result$coefficients[2,1] 不会 return 想要的结果。相反,您使用 lapply 会 return 系数:

old.DT[, beta:=lapply(result, function(x) x$coefficients[2,1])][]

   grp results.of.lm           result       beta
1:   1      <lm[12]> <summary.lm[11]> -0.2819342
2:   2      <lm[12]> <summary.lm[11]>  0.1645671
3:   3      <lm[12]> <summary.lm[11]>  0.2215897