【问题标题】:"object 'ansvals' not found" error - what does it mean?“找不到对象'ansvals'”错误 - 这是什么意思?
【发布时间】:2015-11-22 04:56:22
【问题描述】:

来自我的简单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

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

【问题讨论】:

    标签: r data.table


    【解决方案1】:

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

    来自?data.table关于with的文档:

    默认with=TRUE和j在x的框架内计算;柱子 名称可以用作变量。当with=FALSEj 是一个字符时 列名的向量或列位置的数值向量 select,返回的值始终是data.table。

    当您使用with=FALSE 时,您必须在() 之前选择j 中没有. 的列名,如下所示:dt1[, (colShow), with=FALSE]。其他选项为dt1[, c(colShow), with=FALSE]dt1[, colShow, with=FALSE]。使用dt1[, .(col3)]可以得到同样的结果

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

    另外,通过使用 by = colBy,您告诉 data.table 评估与 with = FALSE 矛盾的 j

    来自?data.table关于j的文档:

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

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

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


    ansvalsdata.table 内部使用的名称。您可以使用 ctrl+f (Windows) 或 cmd+f ( macOS)here.

    【讨论】:

    • 感谢您的解释!这是否真的意味着当列名存储在变量中时无法使用by=
    • @VasilyA 这当然是可能的,但您必须以正确的方式进行。有关示例,请参见 herehere。您可能还想阅读getting started guide
    • 好吧,在这些示例中,by= 根本没有被使用,这使得它完全不同......我将再次阅读入门指南,并可能发布一个单独的问题,说明我到底需要什么。
    【解决方案2】:

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

    Jaap 完全正确。根据他的回答,您可以像这样在j 中使用get()

    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
    

    【讨论】:

    • 谢谢马特!我只是要发布一个问题,询问get() 是否是一个好的解决方案:)
    猜你喜欢
    • 2015-03-09
    • 2015-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多