Porting operazioni di set da frame di dati di R a tabelle di dati: come identificare le righe duplicate?

StackOverflow https://stackoverflow.com/questions/7822138

Domanda

[Aggiornamento 1: Come Matthew Dowle notato, sto usando data.table versione 1.6.7 su R-Forge, non CRAN. Non si vedrà lo stesso comportamento con una versione precedente di data.table.]

Come sfondo: Sono porting alcune piccole funzioni di utilità per fare operazioni insiemistiche sulle righe di un frame di dati o le coppie di frame di dati (cioè ogni riga è un elemento in un insieme), ad esempio unica - per creare un set da un elenco, unione, intersezione, differenza set, ecc Questi mimica di Matlab intersect(...,'rows'), setdiff(...,'rows'), ecc, che non sembrano avere controparti in R (operazioni di set di R sono limitati ai vettori e liste, ma non righe di matrici o frame di dati). Esempi di questi piccoli funzioni sono sotto. Se questa funzionalità per frame di dati esiste già in qualche pacchetto o di base R, io sono aperto a suggerimenti.

Sono stato migrando questi per tabelle di dati e un passo necessario per l'attuale approccio è quello di trovare le righe duplicate. Quando viene eseguito duplicated() viene restituito un errore che indica che le tabelle di dati deve avere le chiavi. Si tratta di uno sfortunato posto di blocco -? Diversa chiavi di impostazione, che non è una soluzione universale e aggiunge ai costi computazionali, c'è qualche 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 dt_operation modello.

C'è qualche modo per aggirare questo problema? Impostazione chiavi funziona solo per gli interi, che è un vincolo che non posso assumere per i dati di input. Così, forse mi manca un modo intelligente per le tabelle dati usare?


funzioni sull'esempio di funzionamento, in cui 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 aiuto è quello di trovare le righe in cui i valori chiave di x non sono tra i valori chiave di y. In questo modo, posso trovare dove AN può essere visualizzato quando si calcola x[y] o y[x]. Anche se questo utilizzo permette di impostare delle chiavi per l'oggetto z_rbind, io preferisco non limitare me stesso di appena questo caso d'uso.

Nota 2: Per i posti relativi, ecco un post su esecuzione unique sul frame di dati, con ottimi risultati per l'esecuzione con il pacchetto data.table aggiornato. E questo è un precedente post su esecuzione unique su tabelle di dati.

È stato utile?

Soluzione

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

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

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

Vedi anche FR # 1384 (Nuovo 'non' e 'whichna' argomenti?) per rendere più facile per gli utenti che, e che si collega alla chiavi che non corrispondono thread che va in modo più dettagliato.


Aggiorna . Ora a v1.8.3, non-adesione è stata implementata.

DT[-DT["a",which=TRUE,nomatch=0],...]   # old idiom
DT[!"a",...]                            # same result, now preferred.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top