对data.table的子集进行命令:等效公式

时间:2014-10-01 02:11:25

标签: r data.table

这三个命令返回相同的结果(对观察子集进行回归)。我想知道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的新会话中运行每个命令,似乎每个命令所花费的时间是相同的。在更一般的情况下,从内存/速度的角度来看,所有这些命令都是等效的吗?谢谢!

1 个答案:

答案 0 :(得分:1)

评论太长了......

第一个命令

  • 创建DT的显式临时副本,其中id> 100
  • 似乎没有为id&lt; = 100
  • 创建系数
  • 创建长度为N的逻辑向量,并使用向量扫描到子集

第二个命令

  • 创建DT的隐式副本,其中id> 100
  • 创建长度为N的逻辑向量,并使用向量扫描到子集
  • 似乎没有为id&lt; = 100
  • 创建系数

第三个命令

  • 创建DT的隐式应对,其中id> 100且id <= 100(仅使用更大的内存)
  • 创建两组系数。

从速度的角度来看,我认为biglm的处理速度很慢(相对于任何data.table的使用)。

您可以通过condition设置密钥来加快速度(但这需要时间)。如果您需要通常使用此条件进行子集化,这似乎很有用。

例如

setkey(DT, condition)

然后,您可以使用二进制搜索按条件提取数据

DT[.(TRUE)]
DT[.(FALSE)]

这些会更快,更有效。

使用update调查处理数据子集以将其添加到biglm可能是值得的。请查看使用profrutils::Rprof(请参阅How to efficiently use Rprof in R?)和文档。