提问人:phillyooo 提问时间:3/8/2017 最后编辑:zx8754phillyooo 更新时间:10/19/2021 访问量:47760
获取每个组的第一个和最后一个值 – dplyr group_by with last() 和 first()
Get first and last values per group – dplyr group_by with last() and first()
问:
下面的代码应按年份对数据进行分组,然后创建两个新列,其中包含每个年份的第一个和最后一个值。
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
答:
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 函数,或者想要一个面向未来的解决方案,则可以像对列表一样对列进行索引:dplyr
first
last
> 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 处理包功能可持续性的方式,您可能是对的:)
上一个:将字符串数组转换为整数数组
下一个:从列表中提取非 null 元素
评论
dplyr
summarize
plyr::mutate
dplyr::mutate