J'ai une trame de données comme ci-dessous:

Name   Place   a    b  c   sum
xyz      mno    1   2  3   6
pqr      jkl    4   6  1   11

Je voudrais une commande dans le script R qui m'aiderait à diviser les valeurs numériques dans la colonne "a", "b" et "c" par valeur dans la colonne "somme" correspondante

Par conséquent, ma sortie serait comme:

Name   Place      a        b       c     sum
xyz     mno       1/6      2/6    3/6     6
pqr     jkl       4/11     6/11   1/11   11
2
Zameer Abbas 29 déc. 2015 à 08:31

2 réponses

Meilleure réponse

Nous pouvons essayer

df1[3:5] <- df1[3:5]/df1[6][row(df1[3:5])]

Ou juste

df1[3:5] <- df1[3:5]/df1[,6]
df1
#   Name Place         a         b          c sum
#1  xyz   mno 0.1666667 0.3333333 0.50000000   6
#2  pqr   jkl 0.3636364 0.5454545 0.09090909  11

Ou en utilisant dplyr

library(dplyr)
df1 %>% 
    mutate_each(funs(./df1$sum), a:c)

Ou nous pouvons utiliser data.table

library(data.table)
setDT(df1)
nm1 <- letters[1:3]
for(j in nm1){
 set(df1, i=NULL, j=j, value= df1[[j]]/df1$sum)
}
2
akrun 29 déc. 2015 à 06:13

Si vous souhaitez le conserver sous forme de fraction, vous pouvez essayer la fonction fractions du package MASS

library(MASS)
fractions(unlist(df[, 3:5])/df[,6])  

# a1   a2   b1   b2   c1   c2 
# 1/6 4/11  1/3 6/11  1/2 1/11 

Cependant, cela évalue 2/6 à 1/3 et ainsi de suite.

0
Ronak Shah 29 déc. 2015 à 06:20