【发布时间】:2016-09-25 16:31:44
【问题描述】:
我想通过应用调用另一个数据帧的函数来改变数据帧。我可以通过几种不同的方式实现这一点,但想知道如何“正确”地做到这一点。
这是我正在尝试做的一个示例。我有一个带有一些开始时间的数据框,还有一个带有一些定时观察的数据框。我想返回一个包含开始时间的数据框,以及开始时间之后某个窗口内发生的观察次数。例如
set.seed(1337)
df1 <- data.frame(id=LETTERS[1:3], start_time=1:3*10)
df2 <- data.frame(time=runif(100)*100)
lapply(df1$start_time, function(s) sum(df2$time>s & df2$time<(s+15)))
到目前为止,我使用 dplyr 得到的最好的结果如下(但这会丢失身份变量):
df1 %>%
rowwise() %>%
do(count = filter(df2, time>.$start_time, time < (.$start_time + 15))) %>%
mutate(n=nrow(count))
输出:
Source: local data frame [3 x 2]
Groups: <by row>
# A tibble: 3 × 2
count n
<list> <int>
1 <data.frame [17 × 1]> 17
2 <data.frame [18 × 1]> 18
3 <data.frame [10 × 1]> 10
我期待能够做到这一点:
df1 <- data.frame(id=LETTERS[1:3], start_time=1:3*10)
df2 <- data.frame(time=runif(100)*100)
df1 %>%
group_by(id) %>%
mutate(count = nrow(filter(df2, time>start_time, time<(start_time+15))))
但这会返回错误:
Error: comparison (6) is possible only for atomic and list types
dplyr 的做法是什么?
【问题讨论】: