我有如下所示的测试数据:
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)
我们可以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)