Portierungsvorgänge von R -Datenrahmen auf Datentabellen festlegen: Wie identifizieren Sie doppelte Zeilen?

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

Frage

Update 1: Wie Matthew Dowle feststellte, benutze ich data.table Version 1.6.7 auf R-Forge, nicht Cran. Sie werden das gleiche Verhalten mit einer früheren Version von nicht sehen data.table.]

Als Hintergrund: Ich porte einige kleine Dienstprogrammfunktionen, um Operationen auf Zeilen eines Datenrahmens oder an Datenrahmen zu setzen (dh jede Zeile ist ein Element in einem Satz), z. B. eindeutig -, um einen Satz aus einer Liste zu erstellen, Union, Schnittpunkt, fester Unterschied usw. Diese Mimic -Matlabs intersect(...,'rows'), setdiff(...,'rows'), usw., die anscheinend keine Gegenstücke in R haben (Rs festgelegte Vorgänge sind auf Vektoren und Listen beschränkt, jedoch nicht auf Zeilen von Matrizen oder Datenrahmen). Beispiele für diese kleinen Funktionen finden Sie unten. Wenn diese Funktionalität für Datenrahmen bereits in einem Paket oder Basis R vorhanden ist, bin ich offen für Vorschläge.

Ich habe diese in Datentabellen migriert und ein notwendiger Schritt im aktuellen Ansatz besteht darin, doppelte Zeilen zu finden. Wann duplicated() Es wird ausgeführt, dass ein Fehler zurückgegeben wird, aus dem angegeben ist, dass Datentabellen Schlüssel haben müssen. Dies ist eine unglückliche Straßensperre - außer dem Festlegen von Schlüssel ist es keine universelle Lösung und erhöht die Rechenkosten. Gibt es eine andere Möglichkeit, doppelte Objekte zu finden?

Hier ist ein reproduzierbares Beispiel:

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)

Ausgeben dieser Fehlermeldung:

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

Der Code funktioniert wie für Datenrahmen, obwohl ich jede Funktion mit dem Muster benannt habe dt_operation.

Gibt es eine Möglichkeit, dieses Problem zu umgehen? Das Einstellen von Schlüssel funktioniert nur für Ganzzahlen. Dies ist eine Einschränkung, die ich für die Eingabedaten nicht annehmen kann. Vielleicht fehlt mir vielleicht eine clevere Möglichkeit, Datentabellen zu verwenden?


Beispielsatz Betriebsfunktionen, bei denen die Elemente der Sets Datenzeilen sind:

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)
}

Anmerkung 1: Eine beabsichtigte Verwendung für diese Helferfunktionen besteht darin, Zeilen zu finden, bei denen die Schlüsselwerte in x nicht zu den Schlüsselwerten in y gehören. Auf diese Weise kann ich feststellen, wo Nas bei der Berechnung erscheinen kann x[y] oder y[x]. Obwohl diese Nutzung die Einstellung von Schlüssel für die ermöglicht z_rbind Objekt, ich würde es vorziehen, mich nicht nur auf diesen Anwendungsfall einzuschränken.

Anmerkung 2: Für verwandte Beiträge, Hier ist ein Beitrag beim Laufen unique auf Datenrahmen mit hervorragenden Ergebnissen für das Ausführen mit dem aktualisierten Ausführen data.table Paket. Und Dies ist ein früherer Beitrag beim Laufen unique auf Datentabellen.

War es hilfreich?

Lösung

duplicated.data.table braucht die gleiche Lösung unique.data.table Ich habe [bearbeiten: jetzt in v1.7.2]. Bitte beschaffen Sie einen weiteren Fehlerbericht: bug.report(package="data.table"). Zum Vorteil anderer Beobachtungen verwenden Sie bereits V1.6.7 von R-Forge, nicht 1,6,6 auf Cran.

In Anmerkung 1 gibt es jedoch eine Idiom: "Nicht zugekommen":

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

Siehe auch FR#1384 (Neue Argumente "nicht" und "Whicna"?) Um das den Benutzern das zu erleichtern Schlüssel, die nicht übereinstimmen Thread, der ins Detail geht.


Aktualisieren. Jetzt in v1.8.3 wurde nicht-join implementiert.

DT[-DT["a",which=TRUE,nomatch=0],...]   # old idiom
DT[!"a",...]                            # same result, now preferred.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top