Я использую пакет data.table.
library(data.table)
df = data.table(col1 = c(2,4,6),
col2 = c(4,6,8),
col3 = c(8,10,12),
col4 = c(20,16,14))
i = 2
df[,3]
df[,i+1]
df[,i]
df[,..i]
df[,..(i+1)]
df[,3] дает третий столбец:
col3
1: 8
2: 10
3: 12
Но df[,i+1] дает только цифру 3. Вот чего я не понимаю. Он отлично работает для собственного data.frame. Почему он не может работать так, как data.frame?
Кроме того, df[,i] возникла ошибка, которая предлагает мне использовать df[,..i] и выдает второй столбец.
Тем не менее, df[,..(i+1)] возникла ошибка: Error in ..(i + 1) : could not find function "..".
Кто-нибудь поможет мне понять различия?
Расскажите о различиях между этими попытками. Какой здесь механизм?





Вы можете прочитать справочный документ data.table и узнать, как использовать with = при вводе ?...
> df[, i + 1, with = FALSE]
col3
<num>
1: 8
2: 10
3: 12
> df[, i + 1]
[1] 3
По умолчанию with=TRUE и j оценивается в пределах x; столбец имена можно использовать в качестве переменных. В случае перекрытия имен переменных внутри набора данных и в родительской области вы можете использовать префикс с двойной точкой ..cols для явной ссылки на родительскую область переменной cols, а не на ваш набор данных.
Когда j — вектор символов имен столбцов, числовой вектор позиции столбца для выбора или в форме startcol:endcol и Возвращаемое значение всегда представляет собой таблицу data.table. with=FALSE не требуется больше для динамического выбора столбцов. Обратите внимание, что x[, cols] эквивалентно x[, ..cols] и x[, cols, with=FALSE] и x[, .SD, .SDcols=столбцы].
Я это понимаю. Но все равно непонятно, почему df[,i+1] дает только номер 3. Я обновил data.table до 1.15.4 (версия R 4.2.1), и он по-прежнему ведет себя так же.
Возможно, это не то, что вы спрашиваете, но я бы предпочел использовать
df[, .SD, .SDcols = i+1]илиdf[[i+1]], если вам просто нужен вектор.