Extrahieren Sie eine Spalte aus einer Datentabelle als Vektor nach Position

77

Wie extrahiere ich eine Spalte aus einer Datentabelle als Vektor anhand ihrer Position? Im Folgenden sind einige Codefragmente aufgeführt, die ich ausprobiert habe:

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

Ich möchte diese Ausgabe über die Spaltenposition erhalten

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

Andere Möglichkeit, diese Ausgabe über die Spaltenposition abzurufen

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

Dies gibt keinen Vektor

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

Diese beiden funktionieren nicht:

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

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

Und das gibt keinen Vektor:

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
Nasse Füße
quelle
Für Tabulaturdaten im Allgemeinen sollten Sie dplyr überprüfen ;)
Mullefa
22
@ Mullefa Ich sehe keinen Grund, warum Sie das Bedürfnis nach diesem Kommentar verspürten.
Roland
2
@Mullefa: data.table schlägt dplyr für einige Arten von Tabulaturdaten. Es ist die OP-Wahl, um es zu verwenden.
smci

Antworten:

102

Eine data.table erbt von der Klasse data.frame. Daher ist es listintern ein (von Spaltenvektoren) und kann als solches behandelt werden.

is.list(DT)
#[1] TRUE

Glücklicherweise ist die Listenuntermenge [[sehr schnell, und im Gegensatz zu [package data.table wird keine Methode dafür definiert. Sie können also einfach verwenden [[, um nach einem Index zu extrahieren:

DT[[2]]
#[1] 3 4
Roland
quelle
Ist es möglich, die Struktur data.table beizubehalten, anstatt sie in einen Vektor zu konvertieren? Gilt das für mehrere Spalten?
rmf
... und wenn Sie die Daten in einer bestimmten Anzahl von Zeilen neben einer bestimmten Spalte (z. B. in diesem Fall Spalte 2) unterteilen möchten, fügen Sie am Anfang der Abfrage einen zusätzlichen Satz eckiger Klammern hinzu. Das heißt, wenn Sie die ersten 10 Zeilen von Spalte 2 wollen, dann ... DT [1:10] [[2]] Danke, das hat meinen Code viel schneller gemacht!
Ben G Small
4

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

Dabei kann colNb eine Ganzzahl (die gewünschte Spaltennummer) oder eine Variable sein, die die Spaltennummer enthält.

lokxs
quelle