structure(list(group = c(17L, 17L, 17L, 18L, 18L, 18L, 18L, 19L, 
19L, 19L, 20L, 20L, 20L, 21L, 21L, 22L, 23L, 24L, 25L, 25L, 25L, 
26L, 27L, 27L, 27L, 28L), var = c(74L, 49L, 1L, 74L, 1L, 49L, 
61L, 49L, 1L, 5L, 5L, 1L, 44L, 44L, 12L, 13L, 5L, 5L, 1L, 1L, 
4L, 4L, 1L, 1L, 1L, 49L), first = c(0, 0, 1, 0, 1, 0, 0, 0, 1, 
0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0)), .Names = c("group", 
"var", "first"), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, 
-26L))
使用前两列中的数据,我想创建第三列(称为first),first == 1仅当var == 1第一次在组中时。换句话说,我想标记groupfullfil中的第一个元素var == 1。我怎样才能做到这一点dplyr?当然group_by应该使用,但是接下来怎么办?
对于未分组的数据,一种解决方案是
first_equal_to = function(x, value)
    (x == value) & (cumsum(x == value) == 1)
所以
tbl %>% group_by(group) %>% mutate(first = first_equal_to(var, 1))
(将其保留为逻辑向量似乎是合适的,因为这就是该列所代表的内容)。
另一个实现是
first_equal_to2 = function(x, value) {
    result = logical(length(x))
    result[match(value, x)] = TRUE
    result
}