2011-10-19 10 views
6

[Aggiornamento 1: come ha osservato Matthew Dowle, sto usando la versione 1.6.7 su R-Forge, non la versione 01.. Non vedrai lo stesso comportamento con una versione precedente di data.table.]Porting delle operazioni di impostazione dai frame di dati di R alle tabelle di dati: come identificare le righe duplicate?

Come sfondo: eseguo il porting di alcune piccole funzioni di utilità per eseguire operazioni su righe di un frame di dati o coppie di frame di dati (ovvero ogni riga è un elemento in un set), ad es unique - per creare un set da un elenco, unione, intersezione, differenza di set, ecc. Questi imitano i valori intersect(...,'rows'), setdiff(...,'rows'), ecc. di Matlab, che non sembrano avere controparti in R (le operazioni di set R sono limitate a vettori e liste, ma non righe di matrici o frame di dati). Ecco alcuni esempi di queste piccole funzioni. Se questa funzionalità per i frame di dati esiste già in alcuni pacchetti o basi R, sono aperto a suggerimenti.

Sono stato migrare questi in tabelle di dati e un passaggio necessario nell'approccio attuale è trovare le righe duplicate. Quando viene eseguito duplicated(), viene restituito un errore che indica che le tabelle di dati devono avere chiavi. Questo è uno sfortunato posto di blocco - oltre all'impostazione di chiavi, che non è una soluzione universale e aggiunge costi computazionali, c'è un altro modo per trovare oggetti duplicati?

Ecco un esempio riproducibile:

library(data.table) 
set.seed(0) 
x <- as.data.table(matrix(sample(2, 100, replace = TRUE), ncol = 4)) 
y <- as.data.table(matrix(sample(2, 100, replace = TRUE), ncol = 4)) 

res3 <- dt_intersect(x,y) 

Cedendo questo messaggio di errore:

Error in duplicated.data.table(z_rbind) : data table must have keys 

Il codice funziona così com'è per i frame di dati, anche se ho chiamato ogni funzione con il modello dt_operation .

C'è un modo per aggirare questo problema? L'impostazione delle chiavi funziona solo per i numeri interi, che è un vincolo che non posso assumere per i dati di input. Quindi, forse mi manca un modo intelligente per usare le tabelle di dati?


funzioni operative esempio dato, dove gli elementi degli insiemi sono righe di dati:

dt_unique  <- function(x){ 
    return(unique(x)) 
} 

dt_union  <- function(x,y){ 
    z_rbind  <- rbind(x,y) 
    z_unique <- dt_unique(z_rbind) 
    return(z_unique) 
} 

dt_intersect <- function(x,y){ 
    zx   <- dt_unique(x) 
    zy   <- dt_unique(y) 

    z_rbind  <- rbind(zy,zx) 
    ixDupe  <- which(duplicated(z_rbind)) 
    z   <- z_rbind[ixDupe,] 
    return(z) 
} 

dt_setdiff  <- function(x,y){ 
    zx   <- dt_unique(x) 
    zy   <- dt_unique(y) 

    z_rbind  <- rbind(zy,zx) 
    ixRangeX <- (nrow(zy) + 1):nrow(z_rbind) 
    ixNotDupe <- which(!duplicated(z_rbind)) 
    ixDiff  <- intersect(ixNotDupe, ixRangeX) 
    diffX  <- z_rbind[ixDiff,] 
    return(diffX) 
} 

Nota 1: Una destinazione d'uso per queste funzioni di supporto è quello di trovare le righe in cui valori di chiave in x non sono tra i valori chiave in y. In questo modo, posso trovare dove possono apparire le NA durante il calcolo di x[y] o y[x]. Sebbene questo utilizzo consenta l'impostazione di chiavi per l'oggetto z_rbind, preferirei non limitarmi a questo caso d'uso.

Nota 2: per i post correlati, here is a post in esecuzione unique su frame di dati, con risultati eccellenti per l'esecuzione con il pacchetto aggiornato data.table. E this is an earlier post su esecuzione unique su tabelle di dati.

risposta

6

duplicated.data.table ha bisogno della stessa correzione unique.data.table ottenuto [EDIT: Ora fatto nella v1.7.2]. Si prega di sollevare un altro bug report: bug.report(package="data.table"). Per il beneficio degli altri, si sta già utilizzando la v1.6.7 di R-Forge, non la 1.6.6 su CRAN.

Ma, Note 1, c'è una 'non unire' idioma:

x[-x[y,which=TRUE]] 

Vedi anche FR#1384 (Nuovo 'non' e gli argomenti 'whichna'?) Per fare che facile per gli utenti, e che i collegamenti alla filettatura keys that don't match che va più nel dettaglio.


Aggiornamento. Ora in v1.8.3, non-join è stato implementato.

DT[-DT["a",which=TRUE,nomatch=0],...] # old idiom 
DT[!"a",...]       # same result, now preferred. 
+0

Grazie! Buon punto - ho dimenticato di dire che ho aggiornato 'data.table'. Inoltre, 'bug.report()' è nuovo per me. – Iterator

+0

Matthew, il codice dovrebbe essere 'x [-x [y, which = TRUE, nomatch = 0]]'? Senza l'argomento 'nomatch = 0' ottengo questo errore:' Errore in [.default (x [[s]], irows): solo gli 0 possono essere combinati con gli indici negativi '. – Ryogi

+0

@RYogi. Non sono sicuro. Hai bisogno di un esempio per favore, forse in una nuova domanda. –

Problemi correlati