
[英]R - How to add the sum of a specific occurrence in one column to another column
[英]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.table
的shift
函数允许您这样做,它具有与lag
和lead
in 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
我们也可以在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.