gpt4 book ai didi

r - data.table 和 "by must evaluate to list"错误

转载 作者:行者123 更新时间:2023-12-04 11:31:16 25 4
gpt4 key购买 nike

我想使用 R 中的 data.table 包来动态生成聚合,但我遇到了错误。下面,让my.dt类型为 data.table .

sex <- c("M","F","M","F")
age <- c(19, 23, 26, 21)
dependent.variable <- c(1400, 1500, 1250, 1100)
my.dt <- data.table(sex, age, dependent.variable)
grouping.vars <- c("sex", "age")
for (i in 1:2) {
my.dt[,sum(dependent.variable), by=grouping.vars[i]]
}

如果我运行这个,我会收到错误:
Error in `[.data.table`(my.dt, , sum(dependent.variable), by = grouping.vars[i] :
by must evaluate to list

然而,以下工作没有错误:
my.dt[,sum(dependent.variable), by=sex]

我明白错误发生的原因,但我不明白如何使用带有 by 的向量范围。

最佳答案

[更新] 提出问题两年后......

在运行问题中的代码时,data.table现在更有帮助并返回这个(使用 1.8.2):

Error in `[.data.table`(my.dt, , sum(dependent.variable), by = grouping.vars[i]) : 
'by' appears to evaluate to column names but isn't c() or key(). Use by=list(...)
if you can. Otherwise, by=eval(grouping.vars[i]) should work. This is for efficiency
so data.table can detect which columns are needed.

并遵循错误第二句中的建议:
my.dt[,sum(dependent.variable), by=eval(grouping.vars[i])] 
sex V1
1: M 2650
2: F 2600



2010 年 7 月的旧答案(虽然 by 现在可以是 doublecharacter):

严格来说 by但是,需要评估一个向量列表,每个向量都具有存储模式整数。所以数值向量 age也可以使用 as.integer() 强制为整数.这是因为 data.table 使用基数排序(非常快),但基数算法仅适用于整数(请参阅维基百科的“基数排序”条目)。键列和临时的整数存储 by是 data.table 速度快的原因之一。一个因素当然是对唯一字符串的整数查找。

背后的理念 by成为 list()表达式的特点是您不受列名的限制。通常将列名的表达式直接写在 by 中。 .一个常见的就是按月汇总;例如 :
DT[,sum(col1), by=list(region,month(datecol))]

或者按年月分组的一种非常快速的方法是使用非基于纪元的日期,例如 yyyymmddL,如包中的一些示例所示,如下所示:
DT[,sum(col1), by=list(region,month=datecol%/%100L)]

请注意如何像这样命名 list() 中的列。

定义和重用复杂的分组表达式:
e = quote(list(region,month(datecol)))
DT[,sum(col1),by=eval(e)]
DT[,sum(col2*col3/col4),by=eval(e)]

或者,如果您不想重新评估 by每次表达式,您可以保存一次结果并重复使用结果以提高效率;如果 by表达式本身需要很长时间来计算/分配,或者您需要多次重用它:
byval = DT[,list(region,month(datecol))]
DT[,sum(col1),by=byval]
DT[,sum(col2*col3/col4),by=byval]

请查看 http://datatable.r-forge.r-project.org/获取最新信息和状态。很快就会有一个新的演示文稿,希望也能尽快向 CRAN 发布 v1.5。这包含在 NEWS 文件中详述的几个错误修复和新功能。 datatable-help 列表每月大约有 30-40 个帖子,这可能也很有趣。

关于r - data.table 和 "by must evaluate to list"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3252057/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com