从我的简单data.table,例如,像这样:
dt1 <- fread("
col1 col2 col3
AAA ab cd
BBB ef gh
BBB ij kl
CCC mn nm")
Run Code Online (Sandbox Code Playgroud)
我正在制作新表,例如,像这样:
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
Run Code Online (Sandbox Code Playgroud)
当我明确指出列名时,这工作正常.但是当我在变量中使用它们并尝试使用时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
Run Code Online (Sandbox Code Playgroud)
到目前为止,我找不到有关此错误的任何信息.
您收到此错误消息的原因是,在使用with=FALSE时告诉data.table将其j视为数据帧.因此,预计COLUMNNAMES的向量,而不是表达式中被评估j为new=.N.
从?data.table约的文档with:
默认情况下
with=TRUE,j在x的帧内计算; 列名可以用作变量.当with=FALSEj是列名的字符向量或要选择的列位置的数字向量时,返回的值始终是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来评估j哪个是与之相矛盾的with = FALSE.
从?data.table约的文档j:
单列名称,列名称的单个表达,列名称
list()的表达式,计算列表的表达式或函数调用(包括也是列表的data.frame和data.table),或者(当with=FALSE)名称向量时或选择的位置.
j在data.table的框架内进行评估; 即,它将列名称视为变量.使用j=list(...)返回多个列和/或列的表达式.单个列或单个表达式返回该类型,通常是向量.查看示例.
又见点1.D和1.G引进小品文的data.table.
ansvals是data.table内部使用的名称.您可以在此处使用ctrl+ f(Windows)或cmd+ f(macOS)查看代码中显示的位置.