我有一个下面的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)
答案 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.