我有一个采用以下一般形式的df:
ID votes
1 65
1 85
2 100
2 20
2 95
3 50
3 60
我想创建一个新的df,该df的每个ID的投票中取两个最高值,并显示它们之间的差异。新的df应该如下所示:
ID margin
1 20
2 5
3 10
是否可以使用dplyr?
答案 0 :(得分:0)
一个选项将是按arrange
按“ ID”,“票”(以desc
结尾或升序),按“ ID”分组并获得diff
前两个“投票”
library(dplyr)
df1 %>%
arrange(ID, desc(votes)) %>%
group_by(ID) %>%
summarise(margin = abs(diff(votes[1:2])))
# A tibble: 3 x 2
# ID margin
# <int> <int>
#1 1 20
#2 2 5
#3 3 10
或者另一个选择是
df1 %>%
group_by(ID) %>%
summarise(margin = max(votes) - max(votes[-which.max(votes)]))
或者使用slice
和diff
df1 %>%
group_by(ID) %>%
slice(row_number(votes)[1:2]) %>%
summarise(margin = diff(votes))
df1 <- structure(list(ID = c(1L, 1L, 2L, 2L, 2L, 3L, 3L), votes = c(65L,
85L, 100L, 20L, 95L, 50L, 60L)), class = "data.frame", row.names = c(NA,
-7L))