Я пытаюсь передать два отдельных списка имен переменных в data.table (v1.9.4). Он возвращает правильные столбцы, но он разделяет имена переменных. Это работает, как ожидалось:Объединение нескольких списков имен переменных в data.table?
dt <- data.table(a=1:3, b=4:6, c=7:9, d=10:12)
dt
a b c d
1: 1 4 7 10
2: 2 5 8 11
3: 3 6 9 12
Он также отлично работает, чтобы пройти один список имен:
dt[,list(a,b)]
a b
1: 1 4
2: 2 5
3: 3 6
Но когда мне нужно пройти несколько списков, он возвращает правильные столбцы, но раздевает имена переменных :
dt[,c(list(a,b), list(c,d))]
V1 V2 V3 V4
1: 1 4 7 10
2: 2 5 8 11
3: 3 6 9 12
Почему два списка? Я использую несколько котировок() 'd переменных. Я прочитал FAQ 1.6, и я знаю, что одним из способов является использование символьного вектора с использованием = FALSE. Но мой реальный случай использования включает пропускание смеси имен и выражений для функции, например,
varnames <- quote(list(a,b))
expr <- quote(list(a*b, c+d))
function(dt, varnames, expr) {
dt[,c(varnames, expr)]
}
И я бы хотел, чтобы «столбцы» имени переменной, чтобы их собственные имена (и они делают, если вы просто пропускать один список, как
dt[,list(a,b,a*b,c+d)]
a b V3 V4
1: 1 4 4 17
2: 2 5 10 19
3: 3 6 18 21
Как можно объединить несколько списков в data.table таким образом, что она по-прежнему возвращает имена столбцов, собственно? (я не совсем уверен, если это data.table проблема или если я я просто делаю что-то глупо в том, как я пытаюсь объединить списки в R, но c(), кажется, делает то, что я хочу.)
Он работает с именованными списками, но не уверен, что это было бы приемлемо для ваших целей. 'dt [, c (list (a = a, b = b), list (c = c, d = d))] –
Интересно - спасибо! Это, безусловно, квалифицируется как обходное решение, и это лучше, чем обходное решение FAQ 1.6, поскольку это также будет работать с выражениями (а не только с именами переменных). Но я все равно хотел бы знать, есть ли способ объединить неназванные списки, чтобы он работал с регулярным (чистым!) Синтаксисом data.table. (Или если я делаю что-то глупо с тем, как я совмещаю цитированные списки.) – cauchy
@cauchy, вы ничего не делаете неправильно, 'data.table' просто делает вам одолжение в простом списке, конвертируя неназванный список в именованный, но он не может этого сделать в более сложных случаях, поскольку намерение не ясно – eddi