Si j'ai un ensemble de données avec une colonne comme indiqué ci-dessous
Col1 Col2 1.080042 1.080042/(1.080042 + 1.083287 + 1.141108 + 1.191246 + 1.117395) 1.083287 1.083287/(1.083287 + 1.141108 + 1.191246 + 1.117395) 1.141108 1.141108/(1.141108 + 1.191246 + 1.117395) 1.191246 1.191246/(1.191246 + 1.117395) 1.117395 1.117395 /1.117395
Ce que je veux créer est une autre colonne Col2 comme celle-ci
Col1 1.080042 1.083287 1.141108 1.191246 1.117395
Col2 est la valeur Col1 divisée par la somme des valeurs Co1 en dessous. Je ne sais pas comment y parvenir efficacement.
3 Réponses :
Nous pouvons obtenir la somme cumulée des éléments rev
erse de 'Col1', obtenir le rev
erse et diviser par 'Col1'
df1 <- structure(list(Col1 = c(1.080042, 1.083287, 1.141108, 1.191246, 1.117395)), class = "data.frame", row.names = c(NA, -5L))
-vérification avec le calcul d'OP
1.080042/(1.080042 + 1.083287 + 1.141108 + 1.191246 + 1.117395) #[1] 0.1924153 1.083287/(1.083287 + 1.141108 + 1.191246 + 1.117395) #[1] 0.238976
df1$Col2 <- df1$Col1/rev(cumsum(rev(df1$Col1))) df1$Col2 #[1] 0.1924153 0.2389760 0.3307800 0.5159945 1.0000000
library(tidyverse) # dplyr and purrr df %>% mutate(Col2 = Col1/accumulate(Col1, `+`, .dir = 'backward')) # Col1 Col2 # 1 1.080042 0.1924153 # 2 1.083287 0.2389760 # 3 1.141108 0.3307800 # 4 1.191246 0.5159945 # 5 1.117395 1.0000000
Une autre solution de base R en plus de cumsum
par @akrun
> df Col1 Col2 1 1.080042 0.1924153 2 1.083287 0.2389760 3 1.141108 0.3307800 4 1.191246 0.5159945 5 1.117395 1.0000000