我在r
中有一个数据框 No. value time
1 2 12
2 4 23
3 6 13
4 8 8
5 10 13
6 12 24
我想要的数据框是
No. value time flag
1 2 12 0 NA
2 4 23 0 (4 >= 12)
3 6 13 0 (6 >= 23,12)
4 8 8 0 (8 >= 13,23,12)
5 10 13 1 (10 >= 8,13,23,12) Satisfied
6 12 24 1 (12 >= 13,23,12) Satisfied
7 14 23 1
我想检查当前值是否大于或等于所有先前的时间行列,如果条件满足,则将标志设置为1.
df$flag <- ifelse(df$value >= lag(df$time),1,0)
但是,这给了我最后一个值来比较并非所有前n行。 我怎么能在r?
答案 0 :(得分:2)
你的输出没有意义,因为在我的书10中仍然小于23.但是为了论证,让我们把它们带到矢量:
set.seed(100)
x <- seq(2,20, by = 2)
y <- sample(4:13)
然后您可以使用cummax
这样轻松地执行您想要的操作:
x >= cummax(y)
结果:
> x >= cummax(y)
[1] FALSE FALSE FALSE TRUE FALSE TRUE TRUE TRUE TRUE TRUE
> x
[1] 2 4 6 8 10 12 14 16 18 20
> y
[1] 7 6 8 4 12 9 13 5 11 10
编辑:在意识到你问了一些与你真正想要的完全不同的东西之后,d.b的这个解决方案将是获得你需要的解决方案:
c(NA, x[-1] >= cummin(head(y, -1)))
# [1] NA FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
答案 1 :(得分:1)
array
数据强>
as.numeric(c(FALSE, sapply(2:length(df$value), function(i)
any(df$value[i] >= df$time[1:(i-1)]))))
#[1] 0 0 0 0 1 1 1