根据data.frame

时间:2018-09-24 16:18:08

标签: r tidyverse

我认为为此必须有一个解决方案,但我一直在寻找与几乎我想要的解决方案有关的解决方案,但并非完全如此。 如果可能的话,寻找一个整洁的解决方案。

我有一个data.frame,例如newdf:

newdf <- data.frame(inside.city = c(TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE))

newdf
  inside.city
1        TRUE
2        TRUE
3        TRUE
4       FALSE
5       FALSE
6        TRUE
7       FALSE
8       FALSE

每次有人“离开城市”(inside.city == FALSE)时,我都想给他们的旅程分配一个唯一的组号,以便生成的data.frame看起来像这样:

  inside.city group
1        TRUE    NA
2        TRUE    NA
3        TRUE    NA
4       FALSE     1
5       FALSE     1
6        TRUE    NA
7       FALSE     2
8       FALSE     2

假设数据已按日期排序。

如何有效地做到这一点?

2 个答案:

答案 0 :(得分:3)

这是使用mutate()的一种方法。我只对列进行了两次转换以简化操作

library(dplyr)
newdf %>% mutate(group=cumsum(!inside.city & lag(inside.city, default=TRUE)), 
                 group=ifelse(inside.city, NA, group)) 

基本上,您只需在看到TRUE之后看到FALSE时就递增,然后将TRUE值设置为NA。

答案 1 :(得分:0)

使用dplyrdata.table的不同解决方案:

df %>%
  mutate(group = ifelse(inside.city == FALSE, rleid(inside.city), NA),
         group = dense_rank(group))