Opérations de portage défini à partir de trames de données de R tableaux de données: Comment identifier les lignes en double?

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

Question

[Mise à jour 1: Comme Matthew Dowle a noté, j'utilise la version 1.6.7 data.table sur R-Forge, non CRAN. Vous ne verrez pas le même comportement avec une version antérieure de data.table.]

Comme fond: Je portage de quelques petites fonctions d'utilité de faire des opérations ensemble sur les lignes d'une trame de données ou des paires de trames de données (à savoir, chaque ligne est un élément dans un ensemble), par exemple unique - pour créer un ensemble à partir d'une liste, union, intersection, différence jeu, etc. Ces mimétique intersect(...,'rows') Matlab, setdiff(...,'rows'), etc., qui ne semble pas avoir homologues dans R (opérations de réglage de R sont limitées à des vecteurs et des listes, mais pas les lignes de matrices ou des trames de données). Des exemples de ces petites fonctions ci-dessous. Si cette fonctionnalité pour les trames de données existe déjà dans certains package ou la base R, je suis ouvert aux suggestions.

J'ai été la migration de ces données aux tables de et une étape nécessaire dans l'approche actuelle est de trouver des lignes dupliquées. Lorsque duplicated() est exécuté une erreur indiquant que retourné les tables de données doivent avoir des clés. Ce barrage routier est un malheureux - autre que les touches de réglage, ce qui est une solution universelle et ajoute aux coûts de calcul, est-il une autre façon de trouver des objets dupliqués

Voici un exemple reproductible:

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)

Cédant ce message d'erreur:

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

Le code fonctionne en l'état pour les trames de données, bien que j'ai nommé chaque fonction avec le motif dt_operation.

Y at-il un moyen de contourner ce problème? Touches de réglage ne fonctionne que pour les entiers, ce qui est une contrainte, je ne peux pas assumer pour les données d'entrée. Alors, peut-être que je manque une façon intelligente d'utiliser des tableaux de données?


exemple de fonctions d'opération, où les éléments des ensembles sont des lignes de données:

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

Note 1: Une utilisation destinée à ces fonctions d'aide est de trouver les lignes où les valeurs clés de x ne sont pas parmi les valeurs clés y. De cette façon, je peux trouver où NAs peut apparaître lors du calcul x[y] ou y[x]. Bien que cette utilisation permet de configurer des touches de l'objet z_rbind, je préfère ne pas me limiter à ce seul cas d'utilisation.

Note 2: Pour les postes connexes, ici est un poste sur l'exécution unique sur des trames de données, avec d'excellents résultats pour fonctionner avec le package data.table mis à jour. Et c'est un précédent post sur l'exécution unique sur tableaux de données.

Était-ce utile?

La solution

duplicated.data.table a besoin de la même solution unique.data.table a [EDIT: Maintenant en fait v1.7.2]. S'il vous plaît soulever un autre rapport de bogue: bug.report(package="data.table"). Pour le bénéfice des autres qui regardent, vous utilisez déjà v1.6.7 de R-Forge, et non 1.6.6 sur CRAN.

Mais, à la note 1, il y a un «pas rejoindre idiome:

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

Voir aussi FR # 1384 (New 'not' et 'whichna' arguments?) pour rendre cela plus facile pour les utilisateurs, et que les liens vers la page touches qui ne correspondent pas fil va plus en détail.


Mise à jour . Maintenant en v1.8.3, non-join a été mis en œuvre.

DT[-DT["a",which=TRUE,nomatch=0],...]   # old idiom
DT[!"a",...]                            # same result, now preferred.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top