1
votes

somme de toutes les valeurs de cette ligne

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.

r sum

0 commentaires

3 Réponses :


3
votes

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

données

df1$Col2 <- df1$Col1/rev(cumsum(rev(df1$Col1)))
df1$Col2
#[1] 0.1924153 0.2389760 0.3307800 0.5159945 1.0000000


0 commentaires

3
votes
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

0 commentaires

2
votes

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


0 commentaires