vettore - unire due dataframe in r




Come seleziono le righe in base a due criteri in data.table in R (2)

Ecco un modo che mi è passato per la testa solo dopo aver posto la domanda e funziona, ma non so come faccia nei benchmark. Non sono attualmente su un computer con una R. installata. Credo che dovrei usare un'istanza cloud. Ad ogni modo, mi piace la sintassi

DT[c("a","b")]

Diciamo che ho un data.table e voglio selezionare tutte le righe in cui la variabile x ha un valore di b. Questo è facile

library(data.table)
DT <- data.table(x=rep(c("a","b","c"),each=3), y=c(1,3,6), v=1:9)
setkey(DT,x)               # set a 1-column key
DT["b"]

A proposito, sembra che si debba impostare una chiave, se la chiave non è impostata su x allora questo non funziona. A proposito, cosa succederebbe se avessi impostato due colonne come chiavi?

Comunque, muovendomi, diciamo che voglio selezionare tutte le righe in cui la variabile x era a o b

DT["b"|"a"]

non funziona

Ma i seguenti lavori

DT[x=="a"|x=="b"]

Ma questo utilizza la scansione vettoriale a frame di dati. Non usa la ricerca binaria. Immagino che per set di dati più piccoli non abbia importanza.

È questo che dovrei fare o sono ignorante della sintassi data.table?

E un'altra cosa. Esistono esempi di procedure di selezione multipla variabili (o sottoinsiemi) booleane più complesse con data.table?

So che potrei sempre tornare a utilizzare la funzione subset () poiché un data.table si comporterà come data.frame se necessario.


L'utilizzo dell'operatore %in% sembra dare un fattore di rendimento di 2 prestazioni. Prendere in considerazione:

library(data.table)
library(rbenchmark)
DT <- data.table(x=sample(letters, 1e6, TRUE), y=rnorm(1e6), v=runif(1e6))
setkey(DT,x)               # set a 1-column key
DT["b"]
f1 <- function() DT[x %in% letters[1:2]]
f2 <- function() DT[x=="a"| x == "b"]

> benchmark(f1(),f2())
  test replications elapsed relative user.self sys.self user.child sys.child
1 f1()          100    8.40 1.000000      7.58     0.81         NA        NA
2 f2()          100   17.11 2.036905     15.54     1.56         NA        NA

> all.equal(f1(), f2())
[1] TRUE

EDIT: aggiunta opzione di Farrel

Nota, questo è su un computer diverso, ma i dossi relativi sono gli stessi.

f3 <- function() DT[c("a", "b")]

  test replications elapsed  relative user.self sys.self user.child sys.child
1 f1()          100  11.281  7.121843     9.745    1.323          0         0
2 f2()          100  23.106 14.587121    20.824    2.224          0         0
3 f3()          100   1.584  1.000000     1.042    0.541          0         0




data.table