“找不到对象'ansvals'”错误 - 这是什么意思?

时间:2015-11-22 04:56:23

标签: r data.table

来自我的简单data.table,例如,像这样:

dt1 <- fread("
col1 col2 col3
AAA  ab   cd
BBB  ef   gh
BBB  ij   kl
CCC  mn   nm")

我正在制作新桌子,例如,像这样:

dt1[,
    .(col3, new=.N),
    by=col1]

>   col1 col3 new
>1:  AAA   cd   1
>2:  BBB   gh   2
>3:  BBB   kl   2
>4:  CCC   op   1

当我明确指出列名时,这工作正常。但是当我在变量中使用它们并尝试使用with=F时,会出现错误:

colBy   <- 'col1'
colShow <- 'col3' 

dt1[,
    .(colShow, 'new'=.N),
    by=colBy,
    with=F] 
# Error in `[.data.table`(dt1, , .(colShow, new = .N), by = colBy, with = F) :   object 'ansvals' not found

到目前为止,我找不到有关此错误的任何信息。

2 个答案:

答案 0 :(得分:7)

您收到此错误消息的原因是,在使用with=FALSE时,您告诉 data.table j视为数据帧。因此,它期望在j中将{1}}中的列名向量而不是表达式进行评估。

来自new=.N关于?data.table的文档:

  

默认情况下with,j在x的帧内进行评估;柱   名称可以用作变量。当with=TRUE j是一个角色时   列名称的向量或列位置的数字向量   select,返回的值始终是data.table。

当您使用with=FALSE时,您必须在with=FALSE j之前选择.中的列名,而不是()dt1[, (colShow), with=FALSE]dt1[, c(colShow), with=FALSE]。其他选项包括dt1[, colShow, with=FALSE]dt1[, .(col3)]。使用with = FALSE

可以获得相同的结果

总结一下:by = colBy用于选择 data.frame 方式的列。所以,你应该这样做。

同样使用j,您要告诉 data.table 评估与with = FALSE相矛盾的?data.table

来自j关于list()的文档:

  

单个列名称,列名称的单个表达式,with=FALSE   列名称的表达式,表达式或函数调用   评估列表(包括data.frame和data.table   列表,或者(当j)一个名称或位置的向量   选择。

     

j=list(...)在data.table的框架内进行评估;即它   将列名视为变量。使用ansvals返回   列的多列和/或表达式。单列或   单个表达式返回该类型,通常是一个向量。见   实例

另请参阅 data.table 的点1.d and 1.g of the introduction vignette

QT 4.8.5 data.table 内部使用的名称。您可以使用 ctrl + f (Windows)或 cmd + f 查看代码中显示的位置( macOS)here

答案 1 :(得分:1)

错误object 'ansvals' not found对我来说就像一个错误。它应该是一个有用的消息或只是工作。我已经提交issue #1440链接回到这个问题,谢谢。

Jaap是完全正确的。根据他的回答,您可以get()使用j,如下所示:

dt1
#   col1 col2 col3
#1:  AAA   ab   cd
#2:  BBB   ef   gh
#3:  BBB   ij   kl
#4:  CCC   mn   nm
colBy
#[1] "col1"
colShow
#[1] "col3"
dt1[,.(get(colShow),.N),by=colBy]
#   col1 V1 N
#1:  AAA cd 1
#2:  BBB gh 2
#3:  BBB kl 2
#4:  CCC nm 1