我有一个包含点击流数据的数据框。我对之前发生的事情感兴趣,并且在由涉及多列的布尔表达式定义的某些事件之后 - 即,给定布尔表达式,我想输出原始数据帧的子集,其中包括10行以上和以下满足表达式的每一行。有没有一种优雅的方法,例如使用dplyr?
添加可重复的示例:
df <- data.frame(col1 = c(rep("a",20), rep("b",20)), col2 = c(1:20, 1:20))
look_around(df, col1 == "a" & col2 %in% c(17,20))
应生成df[7:30,]
编写函数look_around。
答案 0 :(得分:2)
这似乎是subset
的变体,所以我从subset
改编了以下内容:
look_around <- function(data, condition, before=10, after=10) {
# Set default values for `before` and `after` to 10
e <- substitute(condition)
r <- eval(e, data, parent.frame())
rows <- unique(as.vector(sapply(which(r), function(x) {
(x-before):(x+after)
})))
rows <- rows[rows > 0 & rows <= nrow(data)]
data[rows,]
}
输出:
> df <- data.frame(col1 = c(rep("a",20), rep("b",20)), col2 = c(1:20, 1:20))
> look_around(df, col1 == "a" & col2 %in% c(17,20), before=10, after=10)
col1 col2
7 a 7
8 a 8
9 a 9
<snip>
30 b 10