Подтвердить что ты не робот

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

У меня есть dataframe s > 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

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

4b9b3361

Ответ 1

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

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

Ответ 2

Использование 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")])),]

Ответ 3

Вот пара опций 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)

Ответ 4

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