通过查看最后一组来有条件地确定列的值

sum*_*ftw 6 r dplyr tidyverse

我有如下所示的测试数据:

   Group Value
1      a     1
2      a     2
3      a     3
4      a     4
5      b     5
6      b     2
7      b     3
8      c     6
9      c     7
10     c     8
11     c     3
12     c     6
13     d     9
14     d    10
15     e     9
Run Code Online (Sandbox Code Playgroud)

我正在尝试创建一种矢量化方法,最好使用tidyverse工具来创建一个附加列,该列会记录上一个分组中是否存在该值。下面是一个示例:

   Group Value In_Last_Group
1      a     1         FALSE
2      a     2         FALSE
3      a     3         FALSE
4      a     4         FALSE
5      b     5         FALSE
6      b     2          TRUE
7      b     3          TRUE
8      c     6         FALSE
9      c     7         FALSE
10     c     8         FALSE
11     c     3          TRUE
12     c     5          TRUE
13     d     9         FALSE
14     d    10         FALSE
15     e     9          TRUE
Run Code Online (Sandbox Code Playgroud)

我有一种使用标准 for 循环来做到这一点的方法,但我有一个很大的数据集,我相信如果它被矢量化会快得多。任何帮助,将不胜感激。

下面是dput测试数据:

structure(list(Group = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 
3L, 3L, 3L, 3L, 3L, 4L, 4L, 5L), .Label = c("a", "b", "c", "d", 
"e"), class = "factor"), Value = c(1, 2, 3, 4, 5, 2, 3, 6, 7, 
8, 3, 6, 9, 10, 9)), .Names = c("Group", "Value"), row.names = c(NA, 
-15L), class = "data.frame")
Run Code Online (Sandbox Code Playgroud)

akr*_*run 4

我们可以nest在按“Group”分组后,然后删除“data”列的第一个和最后一个元素,用于map2对相应元素进行比较,然后附加FALSE第一组的元素

library(dplyr)
library(purrr)
df2 <- df1 %>%
         group_by(Group) %>%
         nest

flag <-  map2(df2$data[-1], df2$data[-nrow(df2)], ~ 
      .x$Value %in% .y$Value) %>%
      unlist
df1$Last_Group <- c(rep(FALSE, nrow(df2$data[[1]])), flag)
Run Code Online (Sandbox Code Playgroud)