我有一个df,我想与另一个合并并切片,但是我想在特定条件下切片+ 1。
set.seed(1)
df1 <- data.frame(matrix(nrow=20,ncol=3))
colnames(df1) <- c("group","trial","hour")
df1$group <- rep(c("a","b"),each=10)
df1$trial <- rep(c(1,1,1,1,1,2,2,2,2,2),times=2)
df1$hour <- rep(c(1,11,21,31,41),times=4)
df2 <- data.frame(matrix(nrow=4,ncol=3))
colnames(df2) <- c("group","trial","end")
df2$group <- c("a","a","b","b")
df2$trial <- c(1,2,1,2)
df2$end <- runif(4,1,40)
我每10个小时就有一个值,每次试用都在这些个小时之间的某个时间点结束。我想合并和修整df,以便每个人都待到他们结束的那一刻为止,还有一个。 我在第1、11、21、31、41小时有行。因此,如果A2组在15.5小时结束,我希望新的DF在该组/审判中包括第1、11和21小时。
我想出了如何根据试用进行过滤:
df2 %>%
left_join(df1,by=c("group","trial")) %>%
group_by(group,trial) %>%
filter(hour<= end)
但是我也想在“结束”之后保留一行
我想也许我可以使用
df2 %>%
left_join(df1,by=c("group","trial")) %>%
group_by(group,trial) %>%
slice(1:n(hour<= end)+1)`
但这没用。
我想要的输出是:
group trial end hour
<chr> <dbl> <dbl> <dbl>
1 a 1 11.4 1
2 a 1 11.4 11
3 a 1 11.4 21
6 a 2 15.5 1
7 a 2 15.5 11
8 a 2 15.5 21
11 b 1 23.3 1
12 b 1 23.3 11
13 b 1 23.3 21
14 b 1 23.3 31
16 b 2 36.4 1
17 b 2 36.4 11
18 b 2 36.4 21
19 b 2 36.4 31
20 b 2 36.4 41
使每个组/试验都保留行直到“结束”为止。
答案 0 :(得分:1)
不清楚预期。如果要在最后一行hour <= end
之后获得下一行,则使用which
创建位置索引,并在最后一个索引处加1以进行连接
library(dplyr)
df2 %>%
left_join(df1,by=c("group","trial")) %>%
group_by(group,trial) %>%
slice({i1 <- which(hour <= end)
c(i1, tail(i1, 1) + 1)})