获取组中的第一个和最后一个值 - dplyr group_by with last()和first()

phi*_*ooo 7 r data-manipulation dplyr

下面的代码应该按年度对数据进行分组,然后创建两个具有每年第一个和最后一个值的新列.

library(dplyr)

set.seed(123)

d <- data.frame(
    group = rep(1:3, each = 3),
    year = rep(seq(2000,2002,1),3),
    value = sample(1:9, r = T))

d %>% 
    group_by(group) %>%
    mutate(
        first = dplyr::first(value),
        last = dplyr::last(value)
    )
Run Code Online (Sandbox Code Playgroud)

但是,它不能正常工作.预期的结果是

  group  year value first  last
  <int> <dbl> <int> <int> <int>
1     1  2000     3     3     4
2     1  2001     8     3     4
3     1  2002     4     3     4
4     2  2000     8     8     1
5     2  2001     9     8     1
6     2  2002     1     8     1
7     3  2000     5     5     5
8     3  2001     9     5     5
9     3  2002     5     5     5
Run Code Online (Sandbox Code Playgroud)

然而,我得到了这个(它取决于整个数据框的第一个和最后一个值,而不仅仅是组):

  group  year value first  last
  <int> <dbl> <int> <int> <int>
1     1  2000     3     3     5
2     1  2001     8     3     5
3     1  2002     4     3     5
4     2  2000     8     3     5
5     2  2001     9     3     5
6     2  2002     1     3     5
7     3  2000     5     3     5
8     3  2001     9     3     5
9     3  2002     5     3     5
Run Code Online (Sandbox Code Playgroud)

phi*_*ooo 13

dplyr::mutate() 做了伎俩

d %>% 
    group_by(group) %>%
    dplyr::mutate(
        first = dplyr::first(value),
        last = dplyr::last(value)
    )
Run Code Online (Sandbox Code Playgroud)


Aru*_*esh 12

您还可以尝试使用 dpylr 中的汇总函数来获取唯一组的第一个和最后一个值

 d %>% 
    group_by(group) %>% 
        summarise(first_value = first(na.omit(values)),
            last_value = last(na.omit(values))) %>% 
               left_join(d, ., by = 'group')
Run Code Online (Sandbox Code Playgroud)


sah*_*ahn 11

如果您来自未来并且dplyr已停止支持firstlast功能或者想要一个面向未来的解决方案,您可以像列表一样对列进行索引:

\n
> d %>% \n        group_by(group) %>% \n        mutate(\n                first = value[[1]], \n                last = value[[length(value)]]\n        )\n
Run Code Online (Sandbox Code Playgroud)\n
# A tibble: 9 \xc3\x97 5\n# Groups:   group [3]\n  group  year value first  last\n  <int> <dbl> <int> <int> <int>\n1     1  2000     3     3     4\n2     1  2001     8     3     4\n3     1  2002     4     3     4\n4     2  2000     8     8     1\n5     2  2001     9     8     1\n6     2  2002     1     8     1\n7     3  2000     5     5     5\n8     3  2001     9     5     5\n9     3  2002     5     5     5\n
Run Code Online (Sandbox Code Playgroud)\n