是否存在R函数,用于根据指定条件按组减去变量中的值?

时间:2019-05-26 01:32:55

标签: r function dplyr grouping

我有一个采用以下一般形式的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?

1 个答案:

答案 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)]))

或者使用slicediff

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))