2016-06-01 13 views
-2
dt <- data.table(id=c(8,5,4,9,2,7), col1=c(2,1,2,2,3,1), col2=c(1,1,1,2,3,1)) 

    id col1 col2 
1: 8 2 1 
2: 5 1 1 
3: 4 2 1 
4: 9 2 2 
5: 2 3 3 
6: 7 1 1 

Ich mag dt die Teilmenge nur Zeilen zu erhalten, die den Wert 2 in einem col1 oder col2 enthält, Spaltenindizes verwenden, anstatt Namen.Mit Spaltenindex in data.table Zustand

Bearbeiten: Um klar zu sein, ich interessiere mich für Situationen, in denen nur Spaltenindizes bekannt sind (Namen sind unbekannt).

+1

wie 'dt [col1% in% 2 | col2% in% 2,] '? – mtoto

+0

nein, so'dt [as.vector (dt [, 2, mit = F] == 2) | as.vector (dt [, 3, mit = F] == 2)] ', aber ich habe eine große Anzahl von Spalten, daher ist es unpraktisch, dieselbe Bedingung zu kopieren und einzufügen und den Spaltenindex zu ändern. – Orion

+0

@lukeA Ja! Bitte fügen Sie es als Antwort hinzu. – Orion

Antwort

2
dt[rowSums(dt[,grep('col',names(dt)), with=F]==2)!=0,] 
    id col1 col2 
1: 8 2 1 
2: 4 2 1 
3: 9 2 2 

Mit Spaltenindizes:

dt[rowSums(dt[,c(2,3), with=F]==2)!=0,] 
+0

Dies verwendet immer noch die Spaltennamen – Orion

+0

Ich würde eher ID-Spalte auszuschließen dann mit 2 vergleichen, falls es zillion Spalten gibt. – zx8754

+0

'dt [rowSums (dt [, 2: 3, mit = F] == 2)! = 0,]' ist eine indexbasierte Lösung. – lmo

1

Sie könnten die Verwendung .SD und .SDcols:

dt[dt[, Reduce("|", lapply(.SD, function(x) x==2)), .SDcols=2:3]] 
0

Dies funktioniert

> dt <- data.table(id=c(8,5,4,9,2,7), col1=c(2,1,2,2,3,1), col2=c(1,1,1,2,3,1)) 
> dt[dt[[2]] == 2 | dt[[3]] == 2] 
    id col1 col2 
1: 8 2 1 
2: 4 2 1 
3: 9 2 2