我想创建一个新列,如果在另一列的最后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循环)?
答案 0 :(得分:1)
正如您所注意到的,lag
中的dplyr
不允许您将向量作为移位量传递,但shift
中的data.table
函数允许您执行此操作因此,它与lag
中的lead
和dplyr
具有相同的功能,因此您可以使用shift
中的data.table
和Reduce
函数那样做:
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
do
和shift
来自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