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

Get first and last values per group – dplyr group_by with last() and first()

提问人:phillyooo 提问时间:3/8/2017 最后编辑:zx8754phillyooo 更新时间:10/19/2021 访问量:47760

问:

下面的代码应按年份对数据进行分组,然后创建两个新列,其中包含每个年份的第一个和最后一个值。

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)
    )

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

  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

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

  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
r dplyr 数据操作

评论

0赞 Jaap 3/8/2017
它对我有用:我得到一个列,第一个值按组,最后一个值按组。
0赞 akrun 3/8/2017
你能展示一下dplyr
1赞 Bishops_Guest 3/8/2017
你想要而不是变异吗?summarize
5赞 Gregor Thomas 3/8/2017
我的猜测是重复的,您无意中使用了 .然而,“无法按预期工作”的描述是如此模糊,以至于无法知道......plyr::mutatedplyr::mutate
0赞 phillyooo 3/8/2017
谢谢大家!@Gregor解决了问题!此外,我还更新了问题,使其更准确地计算预期结果与实际结果。

答:

48赞 phillyooo 3/18/2017 #1

dplyr::mutate()成功了

d %>% 
    group_by(group) %>%
    dplyr::mutate(
        first = dplyr::first(value),
        last = dplyr::last(value)
    )
11赞 Arun kumar mahesh 5/4/2020 #2

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

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

评论

0赞 Clark Thomborson 10/26/2023
谢谢阿伦,这是一个“更整洁”的解决方案!我在对多个变量分组的 tibble 的 mutate() 中使用 first() 和 last() 时遇到了很大的麻烦,并且无法弄清楚为什么 mutate 调用默默地未能添加多列(对于first_value)。我没有继续调试,而是决定接受您的建议并改用 summarise()。我隐约认为 last() 应用于具有多级分组的 tibble 有点危险,因为 NA 可以出现在其列表列表列表(列表列表列表)的任何级别。
9赞 user438383 10/19/2021 #3

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

> d %>% 
        group_by(group) %>% 
        mutate(
                first = value[[1]], 
                last = value[[length(value)]]
        )
# A tibble: 9 × 5
# Groups:   group [3]
  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

评论

1赞 MS Berends 2/25/2023
鉴于 Tidyverse 处理包功能可持续性的方式,您可能是对的:)