R: Lorsque vous utilisez data.table comment puis-je obtenir des colonnes de y quand je fais x [y]?

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

  •  16-10-2019
  •  | 
  •  

Question

UPDATE :. Vieille question ... il a été résolu par data.table v1.5.3 en février 2011

Je suis en train d'utiliser le paquet data.table, et vraiment comme les speedups que je reçois, mais je suis déconcerté par cette erreur quand je fais x[y, <expr>]x et y sont « données-tables » avec la même clé, et <expr> contient les noms de colonnes des deux x et y:

require(data.table)
x <- data.table( foo = 1:5, a = 5:1 )
y <- data.table( foo = 1:5, boo = 10:14)
setkey(x, foo)
setkey(y, foo)
> x[y, foo*boo]
Error in eval(expr, envir, enclos) : object 'boo' not found

Mise à jour ... Pour clarifier la fonctionnalité que je cherche dans l'exemple ci-dessus: je dois faire l'équivalent de ce qui suit:

with(merge(x,y), foo*boo)

Toutefois, selon l'extrait ci-dessous de la FAQ data.table, cela aurait dû fonctionner:

  

Enfin, bien qu'il semble que   x [y] ne retourne pas les colonnes y,   vous pouvez réellement utiliser les colonnes de   y dans l'expression de j. C'est ce que nous   dire par se joindre à la portée héritée. Pourquoi pas   il suffit de retourner l'union de tous les   colonnes de x et y et ensuite exécuter   expressions à ce sujet? Il se résume à   ecacité de code et ce qui est plus rapide   pour programmer. Lorsque vous écrivez   x [y, foo boo], data.table automatiquement   inspecte l'expression de j pour voir quelles   il utilise des colonnes. Il ne sous-ensemble,   ou d'un groupe, ces colonnes ne. Mémoire   est créée uniquement pour les colonnes j   les usages. foo de dire Let est en x et boo   est en y (ainsi que 20 d'autres colonnes   en y). Is not x [y, foo boo] plus rapide à   programme et plus rapide à courir qu'un   l'étape de fusion suivie d'un autre sous-ensemble   étape?

Je suis conscient de cette question adressé une question similaire, mais il ne semble pas avoir été résolus de façon satisfaisante. Tout le monde sait ce que je suis absent ou malentendu? Merci.

Mise à jour: J'ai demandé à l'aide table de données liste de diffusion et l'auteur du paquet (Matthieu Dowle)

Était-ce utile?

La solution

Je ne sais pas si je comprends bien le problème, et je viens de commencer aussi à lire les documents de data.table bibliothèque, mais je pense que si vous voulez obtenir les colonnes de y et aussi faire quelque chose à ceux des colonnes de a , vous pouvez essayer quelque chose comme:

> x[y,a*y]
     foo boo
[1,]   5  50
[2,]   8  44
[3,]   9  36
[4,]   8  26
[5,]   5  14

Ici, vous rapportiez les colonnes de y multiplié par le a colonne x . Si vous voulez obtenir x s foo multiplié par y s boo , essayez:

> y[,x*boo]
     foo  a
[1,]  10 50
[2,]  22 44
[3,]  36 36
[4,]  52 26
[5,]  70 14

Après avoir modifié: merci @Prasad Chalasani faire la question plus claire pour moi

.

Si la fusion simple est préférable, alors ce qui suit devrait fonctionner. J'ai fait une des données plus complexes pour voir les actions plus profondes:

x <- data.table( foo = 1:5, a=20:24, zoo = 5:1 )
y <- data.table( foo = 1:5, b=30:34, boo = 10:14)
setkey(x, foo)
setkey(y, foo)

Alors seulement une colonne supplémentaire a été ajouté à chaque data.table. Voyons merge et de le faire avec data.tables:

> system.time(merge(x,y))
   user  system elapsed 
  0.027   0.000   0.023 
> system.time(x[,list(y,x)])
   user  system elapsed 
  0.003   0.000   0.006 

D'où ce dernier semble beaucoup plus rapide. Les résultats ne sont pas identiques mais, mais ils peuvent être utilisés de la même manière (avec une colonne supplémentaire de ce dernier terme):

> merge(x,y)
     foo  a zoo  b boo
[1,]   1 20   5 30  10
[2,]   2 21   4 31  11
[3,]   3 22   3 32  12
[4,]   4 23   2 33  13
[5,]   5 24   1 34  14
> x[,list(x,y)]
     foo  a zoo foo.1  b boo
[1,]   1 20   5     1 30  10
[2,]   2 21   4     2 31  11
[3,]   3 22   3     3 32  12
[4,]   4 23   2     4 33  13
[5,]   5 24   1     5 34  14

Donc, pour obtenir xy nous pourrions utiliser: xy <- x[,list(x,y)]. Pour calculer une data.table une colonne de xy$foo * xy$boo, le travail pourrait suivant:

> xy[,foo*boo]
[1] 10 22 36 52 70

Eh bien, le résultat est pas un data.table mais un vecteur à la place.


Mise à jour (29/03/2012):. Merci pour mon pointage pour @ David attention sur le fait que merge.data.table ont été utilisés dans les exemples ci-dessus

scroll top