У меня есть фрейм данных, который содержит несколько идентификаторов. Я хочу удалить записи с двойными идентификаторами, оставив только строку с максимальным значением.
Таким образом, для структурированных, как это (другие переменные не показаны):
id var_1
1 2
1 4
2 1
2 3
3 5
4 2
Я хочу создать это:
id var_1
1 4
2 3
3 5
4 2
Я знаю о unique () и duplicated (), но не могу понять, как включить правило максимизации ...
Ответы:
Одним из способов является обратная сортировка данных и использование
duplicated
для удаления всех дубликатов. Для меня этот метод концептуально проще, чем те, которые применяются. Я думаю, что это должно быть очень быстро.Изменить: я только что понял, что обратная сортировка выше даже не нужно сортировать по
id
всех. Вы могли бы просто использоватьz[order(z$var, decreasing=TRUE),]
вместо этого, и это будет работать так же хорошо.Еще одна мысль ... Если
var
столбец числовой, то есть простой способ сортировкиid
по возрастанию, ноvar
по убыванию. Это исключает необходимость сортировки в конце (при условии, что вы даже хотели, чтобы сортировка была выполнена).источник
Вы действительно хотите выбрать максимальный элемент из элементов с одинаковым идентификатором. Для этого вы можете использовать
ddply
из пакета plyr :unique
иduplicated
для удаления дубликатов записей, в вашем случае у вас есть только дубликаты идентификаторов, а не записи.Обновление: вот код, когда есть дополнительные переменные:
источник
Решение base-R будет включать
split
, как это:split
разбивает фрейм данных на список фрагментов, на котором мы выполняем вырезание до одной строки с максимальным значением, а затем сноваdo.call(rbind,...)
сокращаем список отдельных строк в фрейме данных.источник
ave
является оберткойlapply
+split
, проверьте код (-;order
; для более общих проблемsplit
неизбежно.Я предпочитаю использовать
ave
источник
Еще один способ сделать это с помощью базы:
Я предпочитаю решение pikr mpiktas все же.
источник
Если, как в примере, столбец var уже находится в порядке возрастания, нам не нужно сортировать фрейм данных. Мы просто используем функцию,
duplicated
передающую аргументfromLast = TRUE
, поэтому дублирование рассматривается с обратной стороны, сохраняя последние элементы:В противном случае мы сначала сортируем фрейм данных в порядке возрастания:
Используя
dplyr
пакет:источник