获取R中每个组的最后一行

时间:2018-12-04 20:15:46

标签: r dataframe dplyr

我有一些结构类似的数据:

a <- data.frame("ID" = c("A", "A", "B", "B", "C", "C"),
                "NUM" = c(1, 2, 4, 3, 6, 9),
                "VAL" = c(1, 0, 1, 0, 1, 0))

我正在尝试按IDNUM对其进行排序,然后得到最后一行。 这段代码可以获取最后一行并汇总为唯一的ID,但是,实际上并没有像我想要的那样获得完整的最后一行。

a <- a %>% arrange(ID, NUM) %>%
  group_by(ID) %>%
  summarise(max(NUM))

我了解为什么此代码无效,但是我正在寻找一种dplyr的方式来获取每个唯一的ID的最后一行

预期结果:

  ID        NUM     VAL
  <fct    <dbl>    <dbl>
1 A           2       0
2 B           4       1
3 C           9       0

注意:我承认,尽管它与Select first and last row from grouped data几乎是重复的,但该线程上的答案与我所寻找的不完全相同。

4 个答案:

答案 0 :(得分:2)

也在tidyverse中:

a %>%
 arrange(ID, NUM) %>% #Arranging according ID and NUM
 group_by(ID) %>% #Grouping by ID
 summarise_all(funs(last(.))) #Selecting the last rows of all variables

  ID      NUM   VAL
  <fct> <dbl> <dbl>
1 A        2.    0.
2 B        4.    1.
3 C        9.    0.

答案 1 :(得分:1)

您可以尝试:

a %>% 
  group_by(ID) %>% 
  arrange(NUM) %>%  
  slice(n())

答案 2 :(得分:1)

tail()返回子集对象的最后6个项目。使用aggregate()时,FUN参数的参数在函数后立即使用逗号传递;这里的1是指n = 1,它告诉tail()仅返回最后一项。

aggregate(a[, c('NUM', 'VAL')], list(a$ID), tail, 1)

# Group.1 NUM VAL
# 1       A   2   0
# 2       B   3   0
# 3       C   9   0

答案 3 :(得分:0)

您可以使用top_n。 (分组已经按ID进行了排序,由于{1}仅有1个值,因此不必按NUM进行排序)

library(dplyr)

a %>% 
  group_by(ID) %>% 
  top_n(1, NUM)

# # A tibble: 3 x 3
# # Groups:   ID [3]
#   ID      NUM   VAL
#   <fct> <dbl> <dbl>
# 1 A         2     0
# 2 B         4     1
# 3 C         9     0