"объект" ансавы "не найден" ошибка - что это значит?

из моей простой таблицы данных, например, например:

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 ответа

Причина, по которой вы получаете это сообщение об ошибке, заключается в том, что при использовании with=FALSE вы передаете data.table для обработки j, как если бы это был файл данных. Поэтому он ожидает вектор столбцов, а не выражение, которое должно быть оценено в j как new=.N.

Из документации ?data.table about with:

По умолчанию with=TRUE и j оценивается внутри фрейма x; колонка имена могут использоваться как переменные. Когда with=FALSE j является символом вектор имен столбцов или числовой вектор столбцов в позиции 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 для оценки j, что противоречит with = FALSE.

Из документации ?data.table about j:

Одно имя столбца, один экземпляр столбцов столбцов, list() of выражения имен столбцов, выражение или вызов функции, который оценивает список (включая data.frame и data.table, которые списки) или (когда with=FALSE) вектор имен или позиций для Выбрать.

j оценивается внутри фрейма data.table; то есть видит имена столбцов, как если бы они были переменными. Используйте j=list(...) для возврата несколько столбцов и/или выражений столбцов. Один столбец или одно выражение возвращает этот тип, обычно вектор. См. примеры.

См. также пункты 1.d и 1.g виньетки введения таблицы данных.

ansvals - это имя, которое используется в data.table. Вы можете увидеть, где он появляется в коде, используя ctrl + f (Windows) или cmd + f (macOS) здесь.


Ошибка object 'ansvals' not found выглядит как ошибка для меня. Это должно быть полезным сообщением или просто работать. Я подал вопрос № 1440, ссылаясь на этот вопрос, спасибо.

Яап полностью прав. Следуя его ответу, вы можете использовать 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

licensed under cc by-sa 3.0 with attribution.