столбцы удаляются при удалении дублированных строк в dplyr - PullRequest
0 голосов
/ 02 октября 2018
dat <- data.frame(year = c(1980, 1981, 1982, 1983, 1984, 1985, 1986, 1987, 1988),
             a = c(100, 200, 300, 400, 500, 350, 350, 350, 430),
             p = c(60, 90, 80, 75, 95, 600, 600, 600, 330),
             y = c(1, 1, 12, 11, 12,  13, 13, 13, 20))

, если дублируется y, то сохраняйте y только с самым высоким a.Если дубликаты y имеют одинаковые a, сохраните y с самым высоким p.Если дубликаты y имеют одинаковые a и p, просто удалите их.Я сделал это:

dat %>% dplyr::arrange(y, a, p) %>% dplyr::group_by(y) %>% 
dplyr::filter(a == max(a)) %>% dplyr::filter(p == max(p)) %>%
distinct(a, p, y)

Но как мне сохранить мой столбец year здесь?

1 Ответ

0 голосов
/ 02 октября 2018

Как уже упоминалось в комментариях, вы можете указать .keep_all = TRUE в distinct.

Вы выбираете строки на основе нескольких условий, которые можно объединить в меньшем количестве строк кода с arrange и slice:

library(dplyr)

dat %>% 
  group_by(y) %>% 
  arrange(a, p) %>% 
  slice(n())

Или:

dat %>% 
  group_by(y) %>% 
  arrange(desc(a), desc(p)) %>% 
  slice(1)

Далее, если вы хотите выбрать наибольшее значение из веса, который вы можете использовать top_n:

dat %>% 
  group_by(y) %>% 
  top_n(1, a) %>%
  top_n(1, p) %>% 
  distinct(y, a, p, .keep_all = TRUE)

Последние два подхода сохранят год 1985 для y = 13, тогда как первыйподход сохраняет год 1987. Возможно, вы захотите указать, какой год (максимум или минимум) вы хотите сохранить для дублированных значений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...