r создание столбца со значениями на основе критерия - PullRequest
0 голосов
/ 03 мая 2020

У меня есть набор данных с двумя столбцами, как показано ниже

   w     p
   0.5   0.5267
   0.5   0.5239
   1.0   0.5267
   1.0   0.5267
   1.0   0.5267
   0.5   0.3870
   0.5   0.3566
   1.0   0.4914
   1.0   0.4914  
   0.125 0.5267 
   0.125 0.5239 
   0.125 0.3870 
   0.125 0.3844 
   0.125 0.4942 
   0.125 0.4914 
   0.125 0.3566 
   0.125 0.3540 

Я пытаюсь создать третий столбец на основе этого критерия ниже

Step1 : Start with Row 1 and check the value in Column w. 
        Row 1 column w is not 1  
Step2 : if the value in column w is not 1, then read the next value in column w. 
        Read the next column w value (Row 2)
Step3 : repeat step 2 until the sum of values from column w is 1.
        Column w row1 and row2 , 0.5 + 0.5 = 1
Step4 : Then read the corresponding values in column p.
        0.5267,  0.5239
Step5 : Multiply the values in column p with corresponding values in column w.
        0.5267*0.5 , 0.5239*0.5
Step6 : Add the values from Step 5
        0.5267*0.5 +  0.5239*0.5 
Step6 : Divide the values in column p with sum from step5.
        0.5267/(0.5267*0.5 +  0.5239*0.5) 
        0.5239/(0.5267*0.5 +  0.5239*0.5) 

Ожидаемый результат следующий

   w     p        Result
   0.5   0.5267   0.5267/(0.5267*0.5 +  0.5239*0.5) 
   0.5   0.5239   0.5239/(0.5267*0.5 +  0.5239*0.5)
   1.0   0.5267   1
   1.0   0.5267   1
   1.0   0.5267   1 
   0.5   0.3870   0.3870/(0.3870*0.5 +  0.3566*0.5)
   0.5   0.3566   0.3566/(0.3870*0.5 +  0.3566*0.5)
   1.0   0.4914   1
   1.0   0.4914   1
   0.125 0.5267   0.5267/(0.5267*0.125 + 0.5239*0.125 + 0.3870*0.125 + 0.3844*0.125 + 0.4942*0.125 + 0.4914*0.125 + 0.3566*0.125 + 0.3540*0.125)
   0.125 0.5239   0.5239/(0.5267*0.125 + 0.5239*0.125 + 0.3870*0.125 + 0.3844*0.125 + 0.4942*0.125 + 0.4914*0.125 + 0.3566*0.125 + 0.3540*0.125)
   0.125 0.3870   0.3870/(0.5267*0.125 + 0.5239*0.125 + 0.3870*0.125 + 0.3844*0.125 + 0.4942*0.125 + 0.4914*0.125 + 0.3566*0.125 + 0.3540*0.125)
   0.125 0.3844   0.3844/(0.5267*0.125 + 0.5239*0.125 + 0.3870*0.125 + 0.3844*0.125 + 0.4942*0.125 + 0.4914*0.125 + 0.3566*0.125 + 0.3540*0.125)
   0.125 0.4942   0.4942/(0.5267*0.125 + 0.5239*0.125 + 0.3870*0.125 + 0.3844*0.125 + 0.4942*0.125 + 0.4914*0.125 + 0.3566*0.125 + 0.3540*0.125)
   0.125 0.4914   0.4914/(0.5267*0.125 + 0.5239*0.125 + 0.3870*0.125 + 0.3844*0.125 + 0.4942*0.125 + 0.4914*0.125 + 0.3566*0.125 + 0.3540*0.125)
   0.125 0.3566   0.3566/(0.5267*0.125 + 0.5239*0.125 + 0.3870*0.125 + 0.3844*0.125 + 0.4942*0.125 + 0.4914*0.125 + 0.3566*0.125 + 0.3540*0.125)
   0.125 0.3540   0.3540/(0.5267*0.125 + 0.5239*0.125 + 0.3870*0.125 + 0.3844*0.125 + 0.4942*0.125 + 0.4914*0.125 + 0.3566*0.125 + 0.3540*0.125)

Я мог бы сделать это, используя циклы for и операторы ifelse, задаваясь вопросом, есть ли более элегантный способ выполнить sh это. Благодаря.

1 Ответ

2 голосов
/ 03 мая 2020

Мы можем создать группу, используя совокупную сумму значений w и рассчитать result.

library(dplyr)

df %>%
  group_by(gr = ceiling(cumsum(w))) %>%
  mutate(result = p/sum(w * p)) %>%
  ungroup() %>%
  select(-gr)


# A tibble: 17 x 3
#       w     p result
#   <dbl> <dbl>  <dbl>
# 1 0.5   0.527  1.00 
# 2 0.5   0.524  0.997
# 3 1     0.527  1    
# 4 1     0.527  1    
# 5 1     0.527  1    
# 6 0.5   0.387  1.04 
# 7 0.5   0.357  0.959
# 8 1     0.491  1    
# 9 1     0.491  1    
#10 0.125 0.527  1.20 
#11 0.125 0.524  1.19 
#12 0.125 0.387  0.880
#13 0.125 0.384  0.874
#14 0.125 0.494  1.12 
#15 0.125 0.491  1.12 
#16 0.125 0.357  0.811
#17 0.125 0.354  0.805

Это можно сделать в data.table как:

library(data.table)
setDT(df)[, result := p/sum(w * p), ceiling(cumsum(w))]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...