Витягніть стовпець з таблиці даних. Як вектор за позицією


78

Як витягти стовпець з data.table як вектор за його положенням? Нижче наведено кілька фрагментів коду, які я спробував:

DT<-data.table(x=c(1,2),y=c(3,4),z=c(5,6))
DT
#   x y z
#1: 1 3 5
#2: 2 4 6

Я хочу отримати цей результат, використовуючи позицію стовпця

DT$y 
#[1] 3 4
is.vector(DT$y)
#[1] TRUE

Інший спосіб отримати цей результат за допомогою позиції стовпця

DT[,y] 
#[1] 3 4
is.vector(DT[,y])
#[1] TRUE

Це не дає вектора

DT[,2,with=FALSE]
#   y
#1: 3
#2: 4
is.vector(DT[,2,with=FALSE])
#[1] FALSE

Ці два не працюють:

DT$noquote(names(DT)[2]) # Doesn't work
#Error: attempt to apply non-function

DT[,noquote(names(DT)[2])] # Doesn't work
#[1] y

І це не дає вектора:

DT[,noquote(names(DT)[2]),with=FALSE] # Not a vector
#   y
#1: 3
#2: 4
is.vector(DT[,noquote(names(DT)[2]),with=FALSE])
#[1] FALSE

Для загальних даних табулатури слід перевірити dplyr ;)
Mullefa

22
@Mullefa Я не бачу причини, чому ви відчули потребу в цьому коментарі.
Роланд

2
@Mullefa: data.table б'є dplyr для деяких типів даних табулатури. Вибір OP - це його використання.
smci

Відповіді:


103

Data.table успадковується від класу data.frame. Тому він є list(з векторів стовпців) внутрішньо і може розглядатися як такий.

is.list(DT)
#[1] TRUE

На щастя, піднабір списків, тобто [[дуже швидкий, і, на відміну від [пакунку data.table, не визначає метод для нього. Таким чином, ви можете просто використовувати [[для вилучення за допомогою індексу:

DT[[2]]
#[1] 3 4

Чи можна підтримувати структуру data.table, а не перетворювати на вектор? Це стосується кількох стовпців?
rmf

... і якщо ви хочете задати дані про певну кількість рядків поряд з певним стовпцем (наприклад, у цьому випадку стовпець 2), ви додаєте додатковий набір квадратних дужок в передній частині запиту. Тобто, якщо ви хочете перші 10 рядків стовпця 2, тоді ... DT [1:10] [[2]] Дякую, це зробило мій код набагато швидшим!
Ben G Small

4

DT[,get(names(DT)[colNb])]

де colNb може бути цілим числом (бажаний номер стовпця) або змінною, що містить номер стовпця.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.