diviser les données.table
J'ai un ensemble de données.le tableau que je veux de se scinder en deux. J'ai procéder comme suit:
dt <- data.table(a=c(1,2,3,3),b=c(1,1,2,2))
sdt <- split(dt,dt$b==2)
mais si je veux quelque chose comme ça dans une prochaine étape,
sdt[[1]][,c:=.N,by=a]
Je reçois le message d'avertissement suivant.
Message d'avertissement: Dans
[.data.table
(sdt[[1]], ,:=
(c, .En N, par un = un) :
Non valide .interne.selfref détecté et corrigé par la prise d'une copie de la
toute la table, de sorte que := pouvez ajouter cette nouvelle colonne de référence. À un
plus tôt, ces données.le tableau a été copié par R. Éviter touche<-,
noms<- et attr<- qui R actuellement (et bizarrement) peut copier l'intégralité d'un
les données.table. Utilisation* syntaxe au lieu d'éviter la copie: setkey(),
setnames() et setattr(). Aussi, la liste(DT1,DT2) copier l'intégralité du DT1
et DT2 (R (liste) des copies des objets nommés), l'utilisation reflist() à la place si
en cas de besoin être mis en œuvre). Si ce message ne vous aide pas, veuillez
rapport à datatable-aide, afin que la cause peut être fixe.
Me demandais si il ya une meilleure façon de fractionnement de la table, de sorte qu'il serait plus efficace (et ne serait pas obtenir ce message)?
Je suis la création de deux ensembles mes expériences, basé sur un temps de split.
Je suis curieux de savoir ce que le
.N
signifie dans ce cas?est juste le nombre de lignes pour les groupes.
dans 1.9.7 il est propre
split
méthode pour les données.table, votre code fonctionne très bien sur elle.OriginalL'auteur jamborta | 2013-02-20
Vous devez vous connecter pour publier un commentaire.
Cela fonctionne dans v1.8.7 (et peut travailler dans v1.8.6) :
Mais, comme @mnel dit, c'est inefficace. Veuillez évitez de couper, si possible.
invalid .internal.selfref
que lorsque je fais unattributes(sdt[[1]])$.internal.selfref
, la valeur semble être la même que celle pourdt
(et même surdt2 <- copy(dt)
).. des idées?Exactement, c'est pourquoi il est invalide. Il est censé pointer vers lui-même quand valide. Si vous regardez
.Internal(inspect(sdt[[1]]))
vous devriez voir son adresse de pointeur est différent (une copie a été prise). C'est ce que.internal.selfref
est conçu pour détecter. Le problème avec la copie n'est pas tant la copie en soi, mais que, lorsque R n'est que la copie ne maintient pas le plus affecté vecteur de la colonne des pointeurs. D'où l'avertissement lors de l':=
essaie d'ajouter une nouvelle colonne (il a à la sur-allouer de nouveau) dans le cas où vous avez deux liaisons vers le même objet. Tout à fait correct et destiné.Si l'avertissement est en train de dire: ne pas
base::split
trouver une autre manière, comme ma réponse, de faire la distinction.Il est également
data.table:::selfrefok(sdt[[1]])
qui vérifie si.internal.selfref
est valide ou pas. Retourne 0/1. Délibérément de ne pas exporté comme il est juste prévu pour le débogage/inspection.comme toujours, merci pour le super et le patient explication!
OriginalL'auteur Matt Dowle
J'ai cherché un moyen de faire un split dans les données.tableau, je suis tombé sur cette vieille question.
Parfois, un split est ce que vous voulez faire, et les données.table "par" approche n'est pas commode.
En fait, vous pouvez facilement faire votre fendu à la main avec des données.table seulement des instructions et il fonctionne très efficacement:
OriginalL'auteur haltux