我想通过应用调用另一个数据帧的函数来变更数据帧。我可以通过几种不同的方式实现这一点,但想知道如何“正确地”做到这一点。dplyr mutate调用另一个数据帧
这是我想要做的一个例子。我有一个数据框,有一些开始时间,另一个有一些时间观察。我想返回一个包含开始时间的数据帧,以及在开始时间之后的某个窗口内发生的观察次数。例如
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方式?
这也适用,如果我们使用'mutate'来代替'summarise',这样做的好处是,如果组中有额外变量由变量赋值,它们不会被丢弃 – kungfujam
@kungfujam:是的,但如果有我们需要使用'rowwise'函数来代替'group_by(id)'。请参阅我的编辑。 – aichao
非常真实,谢谢。 – kungfujam