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.

OriginalL'auteur H Park | 2014-10-06