Data.table: [R-Forge # 5222] 'introuvable' lorsque DT [, list (sum (non-.SD-col), lapply (.SD, mean)), by = ..., .SDcols = ...]

Créé le 8 juin 2014  ·  12Commentaires  ·  Source: Rdatatable/data.table

Soumis par: Matt Weller; Attribué à: Personne; Lien R-Forge

Lorsque vous utilisez .SDcols (dans le but d'appliquer une fonction à plusieurs colonnes), je ne peux pas référencer d'autres colonnes dans la table d'origine (v1) en utilisant la syntaxe suivante:

dt = data.table(grp=c(2,3,3,1,1,2,3), v1=1:7, v2=7:1, v3=10:16)
dt.out = dt[, c(v1 = sum(v1),  lapply(.SD,mean)), by = grp, .SDcols = v2:v3]
# Error in `[.data.table`(dt, , list(v1 = sum(v1), lapply(.SD, mean)), by = grp,  : 
#   object 'v1' not found

Une erreur similaire se produit lorsque j'utilise c au lieu de list, il est clair que la colonne v1 n'est pas accessible dans la clause j .

J'ai eu recours au code suivant qui inclut la colonne v1, même si je ne veux pas que cela soit inclus dans la partie lapply , je dois la supprimer après le calcul.

sd.cols = c("v1","v2", "v3")
dt.out = dt[, c(sum.v1 = sum(v1), lapply(.SD,mean)), by = grp, .SDcols = sd.cols]

Selon eddi sur Stackoverflow, il s'agit d'un bogue et il m'a demandé de le signaler. Je ne peux pas fournir beaucoup plus de détails car je ne sais pas exactement quelle partie il pense être un bogue, en regardant la réponse acceptée par Arun et leur discussion qui s'ensuivra mettra en évidence où mais le problème réside.

Voici le message SO pertinent.

High bug

Tous les 12 commentaires

Peu en retard, mais en ajoutant cette question de la mine à la pile

Je n'ai même pas pensé à cela comme un bogue, généralement je fournis des champs obligatoires supplémentaires à .SDcols et plus tard dans j J'utilise .SD[, !"total", with=FALSE] pour exclure les colonnes indésirables.

C'est une autre bonne solution de contournement, je me demande la différence de performance par rapport à l'utilisation de dt$total . Et oui, ce genre de danse de la ligne entre FR et bug, IMO.

Renverser cela à nouveau. On dirait que cela pourrait être une solution très importante. cette question semble liée et pourrait être résolue via DT[, (deltaColsNewNames) := lapply(.SD, normalDelta, price), .SDcols = deltaColsNames]

Voici un autre cas simple où cela serait utile: http://stackoverflow.com/a/32498711/1191259

Un autre à mettre à jour une fois corrigé: http://stackoverflow.com/q/32915770/1191259

Yay! nous pouvons maintenant faire ceci:

require(data.table)
dt = data.table(grp=c(2,3,3,1,1,2,3), v1=1:7, v2=7:1, v3=10:16)
dt.out = dt[, c(v1 = sum(v1),  lapply(.SD,mean)), by = grp, .SDcols = v2:v3]
  #  grp v1  v2   v3
# 1:   2  7 4.5 12.5
# 2:   3 12 4.0 13.0
# 3:   1  9 3.5 13.5

Mise à jour de tous les messages SO liés ici. Merci à tous.

Merci, @arunsrinivasan. J'attendais ce correctif depuis quelques années.

Impressionnant! Merci

Cette page vous a été utile?
0 / 5 - 0 notes