Вычесть из предыдущих строк на основе условий - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть следующий DF, где я хотел бы наложить значения в TEST для RANK == 2 со следующей логикой.

? = MIN ((GROUP_VALUE - TEST [VALUE OF RANK = 1]), GROUP_VALUE / POINT)

   country    GROUP_VALUE   RANK  POINT      TEST
1      USA       2000        1      2.5      1500
2      USA       2000        2      2.5      **?**
3       UK       1000        1      2.5      1000 
4      JPN       3000        1      3.5      1000
5      JPN       3000        2      3.5      **?** 

Ожидаемый результат:

   country    GROUP_VALUE   RANK  POINT      TEST
1      USA       2000        1      2.5      1500
2      USA       2000        2      2.5     *500*
3       UK       1000        1      2.5      1000 
4      JPN       3000        1      3.5      1000
5      JPN       3000        2      3.5     *857.15* 

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

df$test = ifelse(df$rank == 2, min((df$GROUP_VALUE / df$point), df$group_value - lag(df$test), 0)

1 Ответ

0 голосов
/ 07 ноября 2018

Вы можете сделать это с помощью dplyr. mutate используется для создания нового столбца в зависимости от ваших условий. Я также добавляю этап group_by, чтобы мы могли проводить различие между странами.

library(dplyr)
df$TEST <- as.numeric(df$TEST)
df %>%
  group_by(country) %>%
  mutate(TEST = case_when(RANK == 2 ~ min(GROUP_VALUE - TEST[RANK == 1],GROUP_VALUE/POINT), TRUE ~ TEST))

#  country GROUP_VALUE  RANK POINT  TEST
#  <chr>         <int> <int> <dbl> <dbl>
#1 USA            2000     1   2.5 1500 
#2 USA            2000     2   2.5  500 
#3 UK             1000     1   2.5 1000 
#4 JPN            3000     1   3.5 1000 
#5 JPN            3000     2   3.5  857.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...