Существует ли функция R для вычитания значений в переменной по группам на основе указанных условий? - PullRequest
1 голос
/ 26 мая 2019

У меня есть df, который принимает эту общую форму:

ID    votes
1      65
1      85
2      100
2      20
2      95
3      50
3      60

Я хочу создать новый df, который принимает два максимальных значения в голосах для каждого идентификатора и показывает их разницу.Новый df должен выглядеть следующим образом:

ID    margin
1      20
2      5
3      10

Есть ли способ использовать dplyr для этого?

1 Ответ

0 голосов
/ 26 мая 2019

Можно указать 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))
...