编辑:
我不知道cummax函数,再次感谢您!我将尝试将其集成到循环逻辑中,并在需要时提供输出列。
答案 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)
,dplyr
,data.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