Attribuer plusieurs colonnes à l'aide de := dans les données.table, par groupe
Quelle est la meilleure façon d'affecter à plusieurs colonnes à l'aide data.table
? Par exemple:
f <- function(x) {c("hi", "hello")}
x <- data.table(id = 1:10)
Je voudrais faire quelque chose comme ceci (bien sûr, cette syntaxe est incorrecte):
x[ , (col1, col2) := f(), by = "id"]
Et pour prolonger, je risque d'avoir beaucoup de colonnes avec les noms stockés dans une variable (disons col_names
) et je voudrais faire:
x[ , col_names := another_f(), by = "id", with = FALSE]
Quelle est la bonne façon de faire quelque chose comme cela?
- Cela ressemble comme il a été répondu: stackoverflow.com/questions/11308754/...
- Alex, la réponse est proche, mais il ne semble pas fonctionner en combinaison avec
by
comme @Christoph_J est correct de dire. Lien à votre question, ajouté à FR#2120 "Drop besoin avec=FALSE pour LHS de :=", donc il ne sera pas oublié de le revoir. - Pour être clair,
f()
est une fonction retournant plusieurs valeurs, une pour chacun de vos colonnes.
Vous devez vous connecter pour publier un commentaire.
Cela fonctionne à présent en v1.8.3 sur R-Forge. Merci pour mettre en évidence la!
data.table(objectName=ls())[,c("rows","cols"):=dim(get(objectName)),by=objectName]
(Je suis en utilisantdata.table
1.8.11)list
devrait faire tourner; par exemple,[,c("rows","cols"):=as.list(dim(get(objectName))),by=objectName]
. La difficulté est queas.list
a l'appel de la surcharge et de la copie de la petite vecteur. Si l'efficacité est un problème que le nombre de groupes augmente alors s'il vous plaît laissez-nous savoir.list
mais pasas.list
. La vitesse n'est pas un problème. Voulais juste un moyen rapide de trouver des objets dans l'environnement qui a eu un certain nombre de colonnes ou de lignes. C'est hors sujet, mais... que pensez-vous de l'ajout de NCOL àtables()
?x[,mynames:=list(mean(b)*4,sum(b)*3),by=a,with=FALSE][]
) envoie maintenant un message d'avertissement, alors peut-être l'enlever? Sur une note connexe, quelqu'un a suggéré que, avecoptions(datatable.WhenJisSymbolThenCallingScope=TRUE)
, une assignation commex[,mynames:=list(mean(b)*4,sum(b)*3),by=a]
devrait travailler en fait? Semble que ce serait cohérent avec les autres changements, mais je suppose que cela peut casser trop de code d'utilisateur existant (?).x[, .(Col1, Col2) := 'somevalue']
Ceci est particulièrement utile parce que vous pouvez ensuite utiliser RStudio de la saisie semi-automatique pour les noms de colonne à mesure que vous tapez.by=a
cela va fonctionner, mais en retour une réponse différente. Lemean(a)
etsum(a)
agrégats sont recyclés à l'intérieur de chaque groupe lors de laby=a
. Sansby=a
il ne s'en tient qu'à lamean
etsum
pour l'ensemble de la colonne dans chaque cellule (différents numéros).x[, {ans=f(); names(ans):=ans}, by=a]
pourraient être mises en œuvre. Cette syntaxe exprime l'intention tout à fait bien à mes yeux. Ce que vous en pensez?"mynames"
.(mynames):=
attribue le nom de la colonne tenue dans lemynames
variable dans le contexte appelant.Le raccourci suivant la notation pourrait être utile. Tout le crédit va à Andrew Brooks, plus particulièrement cet article.