我有一些结构类似的数据:
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))
我正在尝试按ID
和NUM
对其进行排序,然后得到最后一行。
这段代码可以获取最后一行并汇总为唯一的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几乎是重复的,但该线程上的答案与我所寻找的不完全相同。
答案 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