R - 在列的最后 n 行中添加列检查某物的出现

R - add column checking occurrence of something in last n rows of column

我想创建一个新列,如果在另一列的最后 n 行中找到特定值,则在每一行返回 TRUE,否则返回 FALSE。

这是一个示例数据框(假设这是来自更大数据框的示例):

A
2
23
1
5
6
15
14
3
7
9
55
3
77
2

这就是我想要的(条件值=1 且 n=10)

A   B
2   FALSE
23  FALSE
1   FALSE
5   TRUE
6   TRUE
15  TRUE
14  TRUE
3   TRUE
7   TRUE
9   TRUE
55  TRUE
3   TRUE
77  TRUE
2   FALSE

我可以在 dplyr 的 ifelse 语句中使用许多 "OR" 条件来做到这一点:

df<-df %>% mutate(B=ifelse(lag(A)==1|lag(A,2)==1 ... |lag(A,10)==1,T,F))

但这太乏味了,尤其是当 n 很大时。此外,dplyr 中的滞后仅采用整数,因此 lag(A,1:10) 不起作用。

有没有简单的方法(最好没有 for 循环)?

如您所见,dplyr 中的 lag 不允许您将向量作为移位量传递,但 data.table 中的 shift 函数允许您这样做,它与 dplyr 中的 laglead 具有相同的功能,因此您可以使用 data.table 中的 shiftReduce这样做的功能:

library(data.table)
setDT(df)
df[, B := Reduce("|", shift(A == 1, n = 1:10, fill = F))]
df
     A     B
# 1:  2 FALSE
# 2: 23 FALSE
# 3:  1 FALSE
# 4:  5  TRUE
# 5:  6  TRUE
# 6: 15  TRUE
# 7: 14  TRUE
# 8:  3  TRUE
# 9:  7  TRUE
#10:  9  TRUE
#11: 55  TRUE
#12:  3  TRUE
#13: 77  TRUE
#14:  2 FALSE

我们也可以在 dplyr 中使用 doshiftdata.table

中执行此操作
library(dplyr)
df %>% 
    do(data.frame(., B= Reduce(`|`, shift(.$A==1, n = 1:10, fill = 0)))) 
#   A     B
#1   2 FALSE
#2  23 FALSE
#3   1 FALSE
#4   5  TRUE
#5   6  TRUE
#6  15  TRUE
#7  14  TRUE
#8   3  TRUE
#9   7  TRUE
#10  9  TRUE
#11 55  TRUE
#12  3  TRUE
#13 77  TRUE
#14  2 FALSE