Уникальный на фрейме данных только с выбранными столбцами - PullRequest
61 голосов
/ 30 марта 2012

У меня есть фрейм данных с> 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

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

Ответы [ 4 ]

100 голосов
/ 30 марта 2012

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

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, дубликаты которых я не хочу.Этот код автоматически всегда выбирает first из любых неоднозначных значений.(В данном случае х.)

13 голосов
/ 22 октября 2015

Использование 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")])),]
10 голосов
/ 17 июля 2018

Вот пара 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)
1 голос
/ 10 июля 2018

Незначительное обновление в коде @ 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")]
...