这三个命令返回相同的结果(对观察子集进行回归)。我想知道data.table在后台确实有什么重要的区别。
suppressMessages(library("data.table"))
suppressMessages(library("biglm"))
N=1e7; K=100
set.seed(1)
DT <- data.table(
id = 1:N,
v1 = sample(5, N, TRUE), # int in range [1,5]
v2 = sample(1e6, N, TRUE), # int in range [1,1e6]
v3 = sample(round(runif(100,max=100),4), N, TRUE) # numeric e.g. 23.5749
)
DT[, condition := id>100]
# fist command
coefficients(biglm(v3 ~ v2 + v1, DT[id>100, c("v1", "v2", "v3"), with = FALSE]))
# second command
DT[ id >100, coefficients(biglm(v3 ~ v2 + v1, .SD)), .SDcols = c("v1", "v2", "v3")]
# third command
DT[, coefficients(biglm(v3 ~ v2 + v1, .SD)), by = condition, .SDcols = c("v1", "v2", "v3")]
如果我在R的新会话中运行每个命令,似乎每个命令所花费的时间是相同的。在更一般的情况下,从内存/速度的角度来看,所有这些命令都是等效的吗?谢谢!
答案 0 :(得分:1)
评论太长了......
从速度的角度来看,我认为biglm
的处理速度很慢(相对于任何data.table的使用)。
您可以通过condition
设置密钥来加快速度(但这需要时间)。如果您需要通常使用此条件进行子集化,这似乎很有用。
例如
setkey(DT, condition)
然后,您可以使用二进制搜索按条件提取数据
DT[.(TRUE)]
DT[.(FALSE)]
这些会更快,更有效。
使用update
调查处理数据子集以将其添加到biglm可能是值得的。请查看使用profr
或utils::Rprof
(请参阅How to efficiently use Rprof in R?)和文档。