Muter plusieurs colonnes dans un dataframe
J'ai un ensemble de données qui ressemble à ceci.
bankname bankid year totass cash bond loans
Bank A 1 1881 244789 7250 20218 29513
Bank B 2 1881 195755 10243 185151 2800
Bank C 3 1881 107736 13357 177612 NA
Bank D 4 1881 170600 35000 20000 5000
Bank E 5 1881 3200000 351266 314012 NA
et je veux calculer certains ratios basés sur les bilans des banques. et je veux le jeu de données à ressembler à ce
bankname bankid year totass cash bond loans CashtoAsset BondtoAsset LoanstoAsset
Bank A 1 1881 2447890 7250 202100 951300 0.002 0.082 0.388
Bank B 2 1881 195755 10243 185151 2800 0.052 0.945 0.014
Bank C 3 1881 107736 13357 177612 NA 0.123 1.648585431 NA
Bank D 4 1881 170600 35000 20000 5000 0.205 0.117 0.029
Bank E 5 1881 32000000 351266 314012 NA 0.0109 0.009 NA
Voici le code à reproduire les données
bankname <- c("Bank A","Bank B","Bank C","Bank D","Bank E")
bankid <- c( 1, 2, 3, 4, 5)
year<- c( 1881, 1881, 1881, 1881, 1881)
totass <- c(244789, 195755, 107736, 170600, 32000000)
cash<-c(7250,10243,13357,35000,351266)
bond<-c(20218,185151,177612,20000,314012)
loans<-c(29513,2800,NA,5000,NA)
bankdata<-data.frame(bankname, bankid,year,totass, cash, bond, loans)
Tout d'abord, je me suis débarrassé de NAs dans les bilans.
cols <- c("totass", "cash", "bond", "loans")
bankdata[cols][is.na(bankdata[cols])] <- 0
Puis-je calculer les ratios de
library(dplyr)
bankdata<-mutate(bankdata,CashtoAsset = cash/totass)
bankdata<-mutate(bankdata,BondtoAsset = bond/totass)
bankdata<-mutate(bankdata,loanstoAsset =loans/totass)
Mais, au lieu de l'informatique l'ensemble de ces ratios, ligne par ligne, je veux créer un look à faire tout cela à la fois. Dans Stata, je ne
foreach x of varlist cash bond loans {
by bankid: gen `x'toAsset = `x'/totass
}
Comment puis-je faire?
Méta-commentaires: Lors de la traduction d'une langue à une autre, vous ne devez pas être trop littéral. Des boucles dans Stata souvent à mieux travailler en réseau basées sur des calculs de R. (Même l'inverse peut être vrai: les nouveaux arrivants à Stata d'autres langues, souvent, essayer des boucles sur des observations, qui sont rarement nécessaires.)
Je simplifie mes variables ici, mais dans mon dataset, j'ai plus de 20 catégories d'actifs, afin d'avoir une boucle est utile.
Je n'ai rien contre les boucles; de même, la R typiques de l'utilisateur est certainement heureux avec 20 colonnes....
Comme toujours, je vous Remercie pour votre aide. Je suis en train d'apprendre beaucoup de vous.
Merci de me laisser savoir. Je le ferai à partir de maintenant.
Je simplifie mes variables ici, mais dans mon dataset, j'ai plus de 20 catégories d'actifs, afin d'avoir une boucle est utile.
Je n'ai rien contre les boucles; de même, la R typiques de l'utilisateur est certainement heureux avec 20 colonnes....
Comme toujours, je vous Remercie pour votre aide. Je suis en train d'apprendre beaucoup de vous.
Merci de me laisser savoir. Je le ferai à partir de maintenant.
OriginalL'auteur H Park | 2014-10-06
Vous devez vous connecter pour publier un commentaire.
Mise à jour (au 18 Mars 2019)
Il y a eu un changement. Nous avons été à l'aide de
funs()
dans.funs
(funs(name = f(.)
). Mais ce n'est changé (dplyr 0.8.0 ci-dessus). Au lieu defuns
, maintenant, nous utilisonslist
(list(name = ~f(.))
). Voir la suite de nouveaux exemples.Mise à jour (comme le 2 décembre 2017)
Depuis que j'ai répondu à cette question, je me suis rendu compte que certains utilisateurs ont été vérifier cette réponse. Le dplyr paquet a changé depuis. Je laisse donc la mise à jour suivante. J'espère que cela aidera certaines R les utilisateurs à apprendre à utiliser
mutate_at()
.mutate_each()
est maintenant obsolète. Vous souhaitez utilisermutate_at()
, à la place. Vous pouvez spécifier les colonnes que vous souhaitez appliquer votre fonction dans.vars
. Une façon est d'utiliservars()
. Une autre est d'utiliser un caractère de vecteur contenant les noms de colonnes que vous souhaitez appliquer à votre fonction personnalisée dans.fun
. L'autre est de spécifier des colonnes avec des nombres (par exemple, 5:7 dans ce cas). Notez que, si vous utilisez une colonne pourgroup_by()
, vous avez besoin de changer les chiffres de la colonne positions. Avoir un regard de cette question.J'ai volontairement donné
toAsset
à la fonction personnalisée dans.fun
depuis cela va m'aider à organiser le nouveau nom de la colonne. Auparavant, j'ai utilisérename()
. Mais je pense qu'il est beaucoup plus facile de nettoyer les noms de colonne avecgsub()
dans la présente approche. Si le résultat ci-dessus est enregistré en tant queout
, vous souhaitez exécuter le code suivant afin de supprimer_
dans les noms de colonnes.Réponse originale à cette question
Je pense que vous pouvez économiser un peu de temps de cette façon avec dplyr. L'inconvénient est que vous écraser la trésorerie, des obligations et des prêts.
Si vous préférez votre résultat attendu, je pense que la saisie est nécessaire. Le changement de nom de la partie semble être quelque chose que tu dois faire.
Je suis l'attribution d'une sortie de l'objet, de l'ana dans la tuyauterie de processus. Si cette approche ne fonctionne pas pour vous, vous pourriez le faire,
ana <- bankdata %>% group_by(bankname) %>% summarise_each(funs(whatever = ./totass), cash:loans) %>% rename(cashtoAsset = cash, bondtoAsset = bond, loanstoAsset = loans); ana %>% merge(bankdata,., by = "bank name")
OriginalL'auteur jazzurro
Apply
etcbind
est la "marge" argument dans le
apply
fonction. Cela signifie que la fonction sera appliquée pour les colonnes de vecteur. "1" au lieu permettrait d'appliquer la fonction de lignes. ( vérifier?apply
)OriginalL'auteur hvollmeier
Ici est un
data.table
solution.OriginalL'auteur KFB
C'est l'un des gros inconvénients de
dplyr
: autant que je sache, il n'y a pas de façon simple d'utilisation par programme plutôt que de manière interactive sans une sorte de "hack" comme le déplorableeval(parse(text=foo))
idiome.L'approche la plus simple est la même que dans le logiciel Stata méthode, mais la manipulation de la chaîne est un peu plus détaillé dans les R que dans Stata (ou dans tout autre langage de script pour cette question).
Pour rendre la chose plus Stata, vous pouvez envelopper le tout dans
within
comme suit:mais cela entraîne un certain nombre de piratage avec le
get
etassign
fonctions qui ne sont pas aussi sûr à utiliser, en général, bien que dans votre cas, c'est probablement pas une grosse affaire. Je ne vous recommande pas d'essayer des astuces similaires avecdplyr
, par exemple, parce quedplyr
abus de R est non standard d'évaluation des fonctions et c'est probablement le plus d'ennuis que cela vaut la peine. Une manière plus rapide et probablement supérieur à la solution, consultez ledata.table
paquet qui (je pense) vous permettra d'utiliser le logiciel Stata-comme la syntaxe de boucle mais avecdplyr
de la vitesse. Découvrez le package vignette sur CRAN.Aussi, êtes-vous vraiment sûr que vous voulez réaffecter
NA
entrées à 0?OriginalL'auteur shadowtalker
Essayer:
De sortie:
OriginalL'auteur rnso
Vous peut-être ce qui en fait un peu plus difficile que nécessaire. Juste essayer cela et voir si elle donne ce dont vous avez besoin.
Rendements ceci:
Cela devrait vous aider à démarrer dans la bonne direction.
OriginalL'auteur Matt Jolly