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

Posted

技术标签:

【中文标题】获取每个组的第一个和最后一个值 – dplyr group_by 与 last() 和 first()【英文标题】:Get first and last values per group – dplyr group_by with last() and first() 【发布时间】:2017-07-28 00:15:25 【问题描述】:

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

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

【问题讨论】:

它适用于我:我得到一列,其中包含按组的第一个值和一个按组包含最后一个值的列。 能否显示dplyr的版本 你想要summarize而不是变异吗? 我的猜测是duplicate of this,您无意中使用了plyr::mutate 而不是dplyr::mutate。然而,“没有按预期工作”的描述如此模糊,以至于无法知道...... 谢谢大家! @Gregor 解决了这个问题!另外,我已经更新了这个问题,使预期结果与实际结果更准确。 【参考方案1】:

dplyr::mutate() 成功了

d %>% 
    group_by(group) %>%
    dplyr::mutate(
        first = dplyr::first(value),
        last = dplyr::last(value)
    )

【讨论】:

【参考方案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')

【讨论】:

【参考方案3】:

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

> 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

【讨论】:

以上是关于获取每个组的第一个和最后一个值 – dplyr group_by 与 last() 和 first()的主要内容,如果未能解决你的问题,请参考以下文章

R语言dplyr包使用group_by函数arrange函数和filter函数获取每个分组的第一个第N个最后一个记录实战

从每组的第一行和最后一行获取值

DolphinDB:如何获取每个滑动组的最大值的第一行?

如何编写查询以获取 SQL Server 中每个组的第一个条目? [复制]

如何跳过数组的第一个和最后一个元素的循环并将它们设置为常量值?

获取第n个连续组的第一行/最后一行