在条件+1处切片数据

时间:2019-07-18 15:50:31

标签: r dplyr subset slice

我有一个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

使每个组/试验都保留行直到“结束”为止。

1 个答案:

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