#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
вместо содержимого третьего столбца?