R-在for循环中创建和更新参考值

时间:2018-10-09 19:24:30

标签: r

编辑:

我不知道cummax函数,再次感谢您!我将尝试将其集成到循环逻辑中,并在需要时提供输出列。

2 个答案:

答案 0 :(得分:2)

我认为您不需要任何循环。

为重现性,为了产生可重复性,我在生成上面的帧之前用set.seed(1)设置了随机种子。这使您可以看到与我在下面创建的“完全相同”的框架。

head(within(df, {
  isbetter <- c(TRUE, diff(payoff) > 0)
  maxsofar <- cummax(df$payoff)
  maxsofar <- c(0, maxsofar[-length(maxsofar)])
  isbestsofar <- as.integer(payoff > maxsofar)
}), n=20)
#     X1 X2 X3 X4 X5 X6 X7 X8 ID round     payoff isbestsofar  maxsofar isbetter
# 1    0  1  1  0  1  1  1  1  1     1 0.18776846           1 0.0000000     TRUE
# 21   1  1  0  0  0  0  0  1  1     2 0.50475902           1 0.1877685     TRUE
# 41   1  0  0  0  0  1  0  0  1     3 0.02728685           0 0.5047590    FALSE
# 61   1  1  0  0  0  0  1  0  1     4 0.49629785           0 0.5047590     TRUE
# 81   0  0  0  0  1  1  1  0  1     5 0.94735171           1 0.5047590     TRUE
# 101  1  1  1  0  1  1  0  1  1     6 0.38118213           0 0.9473517    FALSE
# 121  1  1  0  1  0  0  1  0  1     7 0.69821373           0 0.9473517     TRUE
# 141  1  1  0  0  1  0  1  1  1     8 0.68876581           0 0.9473517    FALSE
# 161  0  0  0  0  1  0  0  0  1     9 0.47773068           0 0.9473517    FALSE
# 181  0  1  0  1  1  0  0  1  1    10 0.27334761           0 0.9473517    FALSE
# 201  0  1  0  1  1  0  1  0  1    11 0.75691633           0 0.9473517     TRUE
# 221  0  0  1  1  1  0  1  0  1    12 0.24753206           0 0.9473517    FALSE
# 241  0  0  0  1  0  1  1  0  1    13 0.52133948           0 0.9473517     TRUE
# 261  1  1  0  0  1  0  0  0  1    14 0.61284324           0 0.9473517     TRUE
# 281  0  1  0  1  1  0  1  0  1    15 0.09504998           0 0.9473517    FALSE
# 301  1  1  1  0  0  1  0  0  1    16 0.56575876           0 0.9473517     TRUE
# 321  1  0  1  1  0  1  1  1  1    17 0.01687416           0 0.9473517    FALSE
# 341  1  1  0  1  0  1  0  1  1    18 0.19987888           0 0.9473517     TRUE
# 361  0  0  1  1  1  0  0  1  1    19 0.41758380           0 0.9473517     TRUE
# 381  0  0  1  0  1  1  0  0  1    20 0.20550609           0 0.9473517    FALSE

我使用within来简单创建/处理data.frame中的列;可以很容易地逐字df$isbetter <- c(TRUE, diff(df$payoff) > 0)dplyrdata.table或其他方式轻松完成。任您选择,逻辑和结果应该实际上是相同的(也许不是列顺序)。

答案 1 :(得分:1)

df$cummax = cummax(df$payoff)
df$new_max = df$payoff==df$cummax

编辑:添加了group_by,dplyr管道

library(dplyr)
df2 <- df %>%
  group_by(ID) %>%
  mutate(cummax = cummax(payoff),
         new_max = payoff==cummax) %>%
  ungroup()

输出,显示当我们获得新ID时会发生什么:

> df2[20:30,]

       # A tibble: 11 x 13
      X1    X2    X3    X4    X5    X6    X7    X8    ID round payoff cummax new_max
   <int> <int> <int> <int> <int> <int> <int> <int> <int> <int>  <dbl>  <dbl> <lgl>  
 1     0     0     1     0     1     1     0     0     1    20 0.206   0.947 FALSE  
 2     1     1     0     1     0     0     1     0     1    21 0.377   0.947 FALSE  
 3     0     0     1     0     0     0     1     0     1    22 0.0765  0.947 FALSE  
 4     0     0     1     1     0     0     0     0     1    23 0.145   0.947 FALSE  
 5     0     0     0     1     0     0     1     0     1    24 0.554   0.947 FALSE  
 6     1     0     0     0     1     1     1     1     1    25 0.662   0.947 FALSE  
 7     0     1     1     1     1     0     0     1     2     1 0.736   0.736 TRUE   
 8     0     1     1     1     1     0     0     0     2     2 0.376   0.736 FALSE  
 9     1     1     0     0     0     0     0     0     2     3 0.869   0.869 TRUE   
10     0     0     1     1     1     0     1     1     2     4 0.795   0.869 FALSE  
11     1     1     0     1     1     1     0     1     2     5 0.822   0.869 FALSE