Quelle est la meilleure façon d'attribuer à plusieurs colonnes à l'aide de data.table
? Par exemple:
f <- function(x) {c("hi", "hello")}
x <- data.table(id = 1:10)
Je voudrais faire quelque chose comme ça (bien sûr, cette syntaxe est incorrecte):
x[ , (col1, col2) := f(), by = "id"]
Et pour étendre cela, je peux avoir de nombreuses colonnes avec des noms stockés dans une variable (par exemple 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 ça?
by
@Christoph_J a raison de le dire. Lien vers votre question ajoutée à FR # 2120 "Supprimez le besoin avec = FALSE pour LHS de: =", donc il ne sera pas oublié de revenir.f()
une fonction renvoie plusieurs valeurs, une pour chacune de vos colonnes.Réponses:
Cela fonctionne maintenant dans la v1.8.3 sur R-Forge. Merci de l'avoir souligné!
Ancienne version utilisant l'
with
argument (nous déconseillons cet argument lorsque cela est possible):la source
data.table(objectName=ls())[,c("rows","cols"):=dim(get(objectName)),by=objectName]
(J'utilisedata.table
1.8.11)dim
renvoie un vecteur donc la conversion en typelist
doit le faire pivoter; par exemple[,c("rows","cols"):=as.list(dim(get(objectName))),by=objectName]
. Le problème est qu'il yas.list
a une surcharge d'appel et copie également le petit vecteur. Si l'efficacité est un problème alors que le nombre de groupes augmente, veuillez nous en informer.x[,mynames:=list(mean(b)*4,sum(b)*3),by=a,with=FALSE][]
) jette maintenant un avertissement, alors peut-être le supprimer? Sur une note connexe, quelqu'un a-t-il suggéré que, avecoptions(datatable.WhenJisSymbolThenCallingScope=TRUE)
, une affectation commex[,mynames:=list(mean(b)*4,sum(b)*3),by=a]
devrait en fait fonctionner? Il semble que cela soit cohérent avec les autres changements, même si je suppose que cela pourrait casser trop de code utilisateur existant (?).by=a
cela fonctionnera, mais renvoie une réponse différente. Les granulatsmean(a)
etsum(a)
sont recyclés dans chaque groupe quandby=a
. Sansby=a
cela, colle simplement lemean
etsum
pour toute la colonne dans chaque cellule (c'est-à-dire des nombres différents).La notation abrégée suivante peut être utile. Tout le mérite revient à Andrew Brooks, en particulier à cet article .
la source