Почему не dt[,ncol(dt)] Возвращает содержимое столбца?

#r #datatable #data.table

#r #datatable #data.table

Вопрос:

Я отредактировал этот вопрос на основе комментариев @akrun (спасибо!), понимая, что я не совсем точно задал свой вопрос.

Я в замешательстве, почему следующее не возвращает содержимое последнего столбца в таблице данных.

 > dt <- data.table(A=c(10,10,10),B=c(20,20,20),C=c(30,30,30))
> dt[,ncol(dt)]
[1] 3
 

Если я использую with=F его, он ведет себя так, как я и ожидал, возвращая последний столбец в виде таблицы данных

 > dt[,ncol(dt),with=F]
   C
1: 30
2: 30
3: 30
 

Это возвращает тот же результат, dt[,3] который имеет смысл. Но почему это не так dt[,ncol(dt)] = dt[,3] ? От ?data.table ,

Когда j — вектор имен столбцов или позиций для выбора (как в data.frame). Больше нет необходимости использовать with=FALSE .

Не ncol(dt) возвращает вектор позиций столбцов, вектор длины один? Почему не dt[,ncol(dt)] возвращает содержимое последнего столбца?

Спасибо за вашу помощь!

Ответ №1:

Нам нужно drop = FALSE для data.frame

 df[,ncol(df), drop = FALSE]
 

как и по умолчанию, TRUE если мы проверяем ?Extract

x[i, j, … , drop = TRUE]


Для data.table нам нужно with = FALSE

  dt[, ncol(dt), with = FALSE]
 

и это упоминается в ?data.table справке

Когда j — символьный вектор имен столбцов, числовой вектор позиций столбцов для выбора или вида startcol:endcol , а возвращаемое значение всегда является data.table . значение =FALSE больше не требуется для динамического выбора столбцов. Обратите внимание, что x[, cols] эквивалентно x[, ..cols] и x[, cols, с =FALSE] и x[, .SD, .SDcols=cols] .

Комментарии:

1. Спасибо @akrun, но мне интересно, почему dt[,ncol(dt)] это не равно df[,ncol(df)] . Я понимаю, что мне нужно включить drop=F для фрейма данных и with=F для таблицы данных, чтобы получить возвращенную таблицу, но я хочу, чтобы вектор возвращался из таблицы данных. Для этого примера, почему dt[,3] не равно dt[,ncol(dt)] ?

2. @jeromeResearch вы можете использовать [[ для подмножества dt[, .SD[[ncol(.SD)]]]

3. Я не думал об этом, но да, есть несколько способов получить последнюю колонку. Другой вариант: dt[,ncol(dt),with=F][[1]] . Но я все еще не понимаю, почему dt[,ncol(dt)] возвращается ncol(dt) . Я бы ожидал, что таблица данных и фрейм данных будут вести себя здесь точно так же, но это не так.

4. @jeromeResearch у них разные параметры по умолчанию, и их поведение отличается. Таким образом, вы не можете ожидать, что это будет работать так же

5. Я ценю, что вы обсуждаете это со мной. Забудьте о том, что он должен вести себя как фрейм данных. Для этого примера, почему dt[,ncol(dt)] возвращает 3 вместо содержимого третьего столбца?