繁体   English   中英

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语句中使用许多“或”条件来执行此操作:

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.tableshift函数允许您这样做,它具有与laglead in dplyr相同的功能,因此您可以使用shiftdata.tableReduce功能来做到这一点:

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使用do和从data.table shift

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM