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
中的 lag
和 lead
具有相同的功能,因此您可以使用 data.table
中的 shift
和 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
和 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
我想创建一个新列,如果在另一列的最后 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
中的 lag
和 lead
具有相同的功能,因此您可以使用 data.table
中的 shift
和 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
和 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