在data.table中提取列表列元素时为何需要使用lapply函数
问题解答
核心原因:你操作的result列是列表列(list column),而非普通的原子向量列
不同列的存储结构和函数的向量化特性,是你需要使用lapply的本质原因:
- 你常用的
paste、substr、as.numeric都属于向量化函数,本身就支持输入整列原子向量(比如数值列、字符串列,每个元素都是单个基础值),自动遍历每个元素完成运算,返回长度一致的向量,所以不需要套lapply。 - 你代码中的
result是列表列,每一个单元格存储的是一整个summary(lm)对象,不是单个基础值。直接写result$coefficients[2,1]时,R会把整个result列表作为一个整体去提取coefficients属性,但整个列表本身没有这个属性,只有列表里的每一个独立summary(lm)对象才有,所以必然运行失败。 lapply的作用就是遍历列表列的每一个元素,对每个单独的summary(lm)对象执行系数提取逻辑,返回的结果刚好可以作为新列赋值给beta。
补充说明
你给出的失败示例还存在一个语法笔误:.[, beta := result$coefficients[2,1])]多了一个多余的右括号,但即便修正语法错误,该代码依然无法运行,核心问题还是列表列的遍历逻辑没有实现。除了lapply,你也可以用purrr包的map系列函数实现相同的遍历逻辑,本质上和lapply的作用一致。
内容的提问来源于stack exchange,提问作者Ian Wang
相关产品推荐
相关产品推荐

