[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.
Grazie! Buon punto - ho dimenticato di dire che ho aggiornato 'data.table'. Inoltre, 'bug.report()' è nuovo per me. – Iterator
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
@RYogi. Non sono sicuro. Hai bisogno di un esempio per favore, forse in una nuova domanda. –