根据条件减去前几行

时间:2018-11-07 13:50:48

标签: r

我有一个下面的DF,我想使用以下逻辑在 RANK == 2 TEST 下填充值。

= 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 :(得分:1)

您可以使用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.