我想通过应用一个调用另一个数据帧的函数来改变数据帧 . 我可以通过几种不同的方式实现这一点,但我想知道如何“正确”地做到这一点 .
这是我正在尝试做的一个例子 . 我有一个数据帧有一些开始时间,第二个有一些定时观察 . 我想返回一个数据帧,其中包含开始时间,以及在开始时间之后某些窗口中发生的观察数 . 例如
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的做法是什么?
2 回答
这是一个选项
data.table
,我们可以使用non-equi
连接它给出了与OP的
base R
方法相同的计数如果我们还需要'id'变量作为
dplyr
中的输出,我们可以修改OP的代码或者另一个选项
map
来自purrr
,dplyr
使用
dplyr
的另一种略有不同的方法:我相信您可以使用
length
和which
来计算df1
中每个id
条件为真的出现次数 . 然后,按id
分组并将其用于summarise
.如果每个
id
可能还有一个start_time
,那么你可以使用相同的函数,但rowwise
和mutate
: