我有以下数据框
id<-1:10
x<-c(240, 220, 200, 180, 160, 170, 120, 130, 80, 60)
df<-data.frame(id, x)
我想添加一列(名为“valid”),指示 x 值是否小于前 3 个 x 值。如果 x 值满足此条件,则“有效”中的相应行必须 = 1
理想情况下,我希望 x 值仅包含在标准中,如果它们获得“有效”值 = 1
我预计 NA 在“有效”列的前 3 行中。
输出将如下所示:
id<-1:10
x<-c(240, 220, 200, 180, 160, 170, 120, 130, 80, 60)
valid<-c(NA, NA, NA, 1, 1, 0, 1, 0, 1, 1)
df1<-data.frame(id, x, valid)
id x valid
1 240 NA
2 220 NA
3 200 NA
4 180 1
5 160 1
6 170 0
7 120 1
8 130 0
9 80 1
10 60 1
如果您只需要检查 3 个值,则可以使用lag
:
library(dplyr)
library(zoo)
df %>% mutate(valid = +(x < lag(x) & x < lag(x, 2) & x < lag(x, 3)))
更通用的解决方案是使用滚动操作和窗口大小进行回顾,以便即使您必须测试最后 10 个值也可以轻松扩展它。
df %>% mutate(valid = +(x < lag(rollapplyr(x, 3, min, fill = NA))))
# id x valid
#1 1 240 NA
#2 2 220 NA
#3 3 200 NA
#4 4 180 1
#5 5 160 1
#6 6 170 0
#7 7 120 1
#8 8 130 0
#9 9 80 1
#10 10 60 1
在+
一开始将逻辑值(TRUE
/ FALSE
)为整数值(1
/ 0
)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句