“环顾四周”子集函数

时间:2016-07-28 21:11:43

标签: r dplyr subset

我有一个包含点击流数据的数据框。我对之前发生的事情感兴趣,并且在由涉及多列的布尔表达式定义的某些事件之后 - 即,给定布尔表达式,我想输出原始数据帧的子集,其中包括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。

1 个答案:

答案 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