2015-11-12 3 views
2

Для извлечения уровней из таблицы data.table является стандартным способом привязки к data.table в виде списка или каким-то образом сделать это в скобках?Извлечение уровней из data.table

Например, используя встроенные данные npk, я знаю, что первые 4 столбца являются факторами, и я хочу извлечь уровни.

dat <- as.data.table(npk) 

Это то, что я хочу, список уровней

levs <- lapply(dat[,1:4,with=FALSE], levels) 

Но я отсутствует data.table так, что будет что-то вроде этого? (это не правильно, потому что он повторяет уровни, соответствующие самому длинному).

levs2 <- dat[, lapply(.SD, levels), .SDcols=names(dat)[1:4]] 

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

+1

'DAT [,. (Var = имена (.sd), лева = lapply (.sd, уровни)), .SDcols = names (dat) [1: 4]] ', если вы хотите получить немного свернутого' data.table' вывода. – thelatemail

ответ

2

Ваш первый пример кажется мне разумным, и я не думаю, что вы можете сделать это в скобках таблицы data.table, так как тип возвращаемого значения должен быть списком.

Другой вариант Filter(Negate(is.null),lapply(DT,levels)), который имеет дополнительное преимущество, не нужно знать, какие столбцы являются факторами заранее

+0

@rawr справедливая точка, но я бы предпочел, чтобы компьютер сделал это, а затем вручную проверил список. Не могу себе представить, чтобы стоимость была значительной. Будут ли функции уровней сначала проверять векторный тип, а затем кричать «NULL» или проверять каждый элемент вектора. В качестве альтернативы сказал бы, будет ли увеличение стоимости большим количеством строк? – Chris

+0

строк или столбцов? 'levels' даже не смотрит на строки, а только на атрибуты. Я не использую таблицу данных, но я полагаю, что было бы более эффективно индексировать столбцы, которые являются факторами, а затем получать уровни, полагая, что таблица данных также подмножает столбцы по ссылке. в основном, это медленный бит – rawr

+1

@rawr Я имел в виду строки. И вы правы (доказаны с помощью testa <- runif (100000000); testb <- runif (2); microbenchmark :: microbenchmark (a = levels (testa), b = levels (testb))) Все это означает, что стоимость вычисляется только по столбцам, а не по строкам. Поэтому я бы предпочел проверить все столбцы с помощью общего решения, а затем вручную идентифицировать каждый столбец (что является проблемой человека, которая также масштабируется с количеством столбцов). – Chris

Смежные вопросы