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

时间:2016-08-08 00:28:56

标签: r dataframe conditional dplyr lag

我想创建一个新列,如果在另一列的最后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循环)?

2 个答案:

答案 0 :(得分:1)

正如您所注意到的,lag中的dplyr不允许您将向量作为移位量传递,但shift中的data.table函数允许您执行此操作因此,它与lag中的leaddplyr具有相同的功能,因此您可以使用shift中的data.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

答案 1 :(得分:0)

我们也可以在dplyr doshift来自data.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