Уникальный на фрейме данных только с выбранными столбцами

У меня есть датафрейм с> 100 столбцами, и я хотел бы найти уникальные строки, сравнивая только два из столбцов. Я надеюсь, что это легко, но я не могу заставить его работать сunique или жеduplicated себя.

Ниже я хотел бы использовать уникальные только id и id2:

data.frame(id=c(1,1,3),id2=c(1,1,4),somevalue=c("x","y","z"))

id id2 somevalue
1   1         x
1   1         y
3   4         z

Я хотел бы получить либо:

id id2 somevalue
1   1         x
3   4         z

или же:

id id2 somevalue
1   1         y
3   4         z

(У меня нет предпочтения, какой из уникальных рядов сохраняется)

 Ina30 мар. 2012 г., 16:34
У меня нет никакого предпочтения, включен ли «x» или «y». Я обновлю вопрос.
 Henrik10 июл. 2018 г., 17:21
 joran30 мар. 2012 г., 16:33
Ваш желаемый результат не очень хорошо определен. Как вы решили включить х, но не у? Это решение нужно будет принять для каждого столбца каждой повторяющейся строки, и вы не указали, как это сделать.

Ответы на вопрос(4)

Вот параdplyr параметры, которые сохраняют неповторяющиеся строки на основе столбцов id и id2:

library(dplyr)                                        
df %>% distinct(id, id2, .keep_all = TRUE)
df %>% group_by(id, id2) %>% filter(row_number() == 1)
df %>% group_by(id, id2) %>% slice(1)
 sbha09 февр. 2019 г., 13:32
@ Возможно, если есть дата или какое-либо другое последовательное поле, можно использовать комбинацию двух других вариантов с некоторыми небольшими изменениями, чтобы гарантировать сохранение самого последнего наблюденияdf %>% group_by(id, id2) %>% filter(date == max(date)) %>% slice(1) без необходимости сортировать данные.filter() получает самую последнюю дату,slice() гарантирует, что только одно наблюдение возвращается, если есть связи. В других случаях что-то вродеdf %>% group_by(id, id2) %>% slice(max(row_number())) может дать больше гибкости. Вы всегда можете использоватьarrange() доdistinct() слишком.
 Frank17 июл. 2018 г., 20:40
Я думаю, нет причин для рассмотрения вопроса об использовании альтернативdistinct
Решение Вопроса

если не имеет значения, какое значение в столбце без дубликатов вы выбрали, это должно быть довольно просто:

dat <- data.frame(id=c(1,1,3),id2=c(1,1,4),somevalue=c("x","y","z"))
> dat[!duplicated(dat[,c('id','id2')]),]
  id id2 somevalue
1  1   1         x
3  3   4         z

Внутриduplicated звоните, я просто передаю только те столбцы изdat что я не хочу дубликатов. Этот код автоматически всегда выбираетпервый любых неоднозначных ценностей. (В этом случае х.)

 Mike Palmice18 окт. 2017 г., 21:22
@Ferroao согласно этому сайту, это не возможно в SQLdofactory.com/sql/select-distinct
 Ferroao10 апр. 2017 г., 15:08
какая версия для данных

С помощьюunique():

dat <- data.frame(id=c(1,1,3),id2=c(1,1,4),somevalue=c("x","y","z"))    
dat[row.names(unique(dat[,c("id", "id2")])),]

Незначительное обновление в коде @ Joran.
Используя приведенный ниже код, вы можете избежать двусмысленности и получить уникальные только два столбца:

dat <- data.frame(id=c(1,1,3), id2=c(1,1,4) ,somevalue=c("x","y","z"))    
dat[row.names(unique(dat[,c("id", "id2")])), c("id", "id2")]
 Gregor10 июл. 2018 г., 17:25
Это выглядит идентично ответу Гэри Фенга, за исключением того, что вы не включилиsomevalue результат.

Ваш ответ на вопрос