来自我的简单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
到目前为止,我找不到有关此错误的任何信息。
答案 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