Sélectionnez NA dans un ensemble de données.table en R
Comment puis-je sélectionner toutes les lignes qui ont une valeur manquante dans la clé primaire dans une table de données.
DT = data.table(x=rep(c("a","b",NA),each=3), y=c(1,3,6), v=1:9)
setkey(DT,x)
Sélection pour une valeur particulière est facile
DT["a",]
Sélection pour les valeurs manquantes semble avoir besoin d'un vecteur de recherche. On ne peut pas utiliser les binaires de recherche. Suis-je la corriger?
DT[NA,]# does not work
DT[is.na(x),] #does work
Vous devez vous connecter pour publier un commentaire.
Heureusement,
DT[is.na(x),]
est presque aussi rapide que (par exemple)DT["a",]
, si dans la pratique, cela ne peut pas vraiment beaucoup d'importance:===
Plus de Matthieu (ne rentre pas dans les commentaires) :
Les données ci-dessus a 3 groupes de très grande taille, cependant. Donc, l'avantage de rapidité de recherche binaire est dominée ici par le temps de créer un grand sous-ensemble (1/3 des données est copié).
Que la taille du sous-ensemble retourné diminue (par exemple l'ajout de plusieurs groupes), la différence devient évidente. Vecteur des analyses sur une seule colonne ne sont pas trop mauvais, mais sur 2 ou plusieurs colonnes, il se dégrade rapidement.
Peut-être le NAs doit être joignable à. Il me semble me rappeler d'un chat avec qui, si. Voici un peu d'histoire liée à partir de FR#1043 d'Autoriser ou d'interdire NA clés?. Il mentionne qu'il y
NA_integer_
est à l'intérieur d'un nombre entier négatif. L'accord sur les adpic jusqu'radix/comptage de tri (iirc), résultant ensetkey
va plus lentement. Mais c'est sur la liste à revoir.which=TRUE
pour isoler le temps de recherche est propre idée. Aussi,DT[is.na(x),]
semble encore à battre autre chose que je ai été en mesure de venir avec. J'ai d'abord essayéDT[-DT[na.omit(unique(DT[,1,with=FALSE])), which=TRUE],]
, mais c'est comme sloow comme vous pouvez le deviner. Non pas que c'est le problème ci-dessus, mais estunique()
vraiment le moyen le plus rapide pour extraire les niveaux uniques d'un détrompeur colonne (ou un ensemble de incrustée colonnes)?[,1,with=FALSE]
conserve la touche ok, doncunique.data.table
doit appelerduplist
qui fonctionne commewhich(diff!=0)
mais sur des listes de colonnes. Donc oui, la partie unique devrait être aussi rapide comme un vecteur d'analyse, parce qu'il sait que c'est trié. Mais parce que tous les groupes sont en train d'être rejoint à, il pourrait être de frapper connu (pour moi) de la ride. La recherche de données.table.R pourmapply
et le commentaire. Je suppose que c'est de croquer dans ce cas. En espérant pour le remplacer par debit::vecseq
le plus vite possible!DT[,j,with=FALSE]
une copie de la j colonnes dans la nouvelle table. Une copie instantanée, mais il a besoin de marquer, donc un copier-sur-changement au niveau des colonnes peut être fait si:=
est utilisé plus tard.mapply
. En fin de comptebit::vecseq
a été mis en œuvre dans R, donc je l'ai fait en C, et de l'utiliser à l'interne. Le ralentissement de plusieurs minutes à quelques secondes maintenant comme il se doit. Solution de contournement demult="first"
n'est plus nécessaire. Dans v1.8.3 sur R-Forge. Eh bien, j'espère. Au moins, dans mes tests.C'est maintenant mis en place en v1.8.11. De NOUVELLES:
Bien que vous aurez à fournir le bon
NA
(NA_real_
,NA_character_
etc..) explicitement à l'heure actuelle.Sur les OP de données:
Aussi, ici, de la même référence de @JoshOBrien post, avec cette recherche binaire pour NA a ajouté:
DT[NA]
fait maintenant une jointure?rbenchmark
semble changer pourNA
deNA_character_
à afficher pour une raison quelconque.DT[J(!NA_real_)]
n'a pas de travail.DT[!J(NA_real_)]
.