簡體   English   中英

將一行與前 3 行進行比較

[英]Compare a row with previous 3 rows

我有以下數據框

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 行中。

output 看起來像這樣:

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)))

更通用的解決方案是使用具有 window 大小的滾動操作進行回顧,以便即使您必須測試最后 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 ) 轉換為 integer 值 ( 1 / 0 )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM