Эквивалент R SELECT DISTINCT для двух или более полей/переменных

Скажем, у меня есть фрейм данных df с двумя или более столбцами, есть ли простой способ использовать unique() или другую функцию R для создания подмножества уникальных комбинаций двух или более столбцов?

Я знаю, что могу использовать sqldf() и написать простой "SELECT DISTINCT var1, var2, ... varN" запрос, но я ищу способ R сделать это.

Мне пришло в голову попробовать ftable привести к dataframe и использовать имена полей, но я также получаю перекрестные таблицы комбинаций, которых нет в наборе данных:

uniques <- as.data.frame(ftable(df$var1, df$var2))

person wahalulu    schedule 24.05.2010    source источник


Ответы (4)


unique работает на data.frame, поэтому unique(df[c("var1","var2")]) должно быть тем, что вам нужно.

Другой вариант — distinct из dplyr package:

df %>% distinct(var1, var2) # or distinct(df, var1, var2)

Примечание.

Для более старых версий dplyr (‹ 0.5.0, 2016-06-24) distinct требуется дополнительный шаг

df %>% select(var1, var2) %>% distinct

(или по-старинке distinct(select(df, var1, var2))).

person Marek    schedule 24.05.2010

@ Ответ Марека, очевидно, правильный, но может быть устаревшим. Текущая версия dplyrversion (0.7.4) позволяет использовать еще более простой код:

Просто используйте:

df %>% distinct(var1, var2)

Если вы хотите сохранить все столбцы, добавьте

df %>% distinct(var1, var2, .keep_all = TRUE)
person tjebo    schedule 01.03.2018

Чтобы СОХРАНИТЬ все остальные переменные в df, используйте это:

unique_rows <- !duplicated(df[c("var1","var2")])

unique.df <- df[unique_rows,]

Другой менее рекомендуемый метод — использование row.names() # (см. комментарий Дэвида ниже):

unique_rows <- row.names(unique(df[c("var1","var2")]))

unique.df <- df[unique_rows,]
person sbaniwal    schedule 20.07.2017
comment
Нет. Работать с именами строк — всегда плохая идея. Просто используйте duplicated, если вам нужен логический вектор. - person David Arenburg; 20.07.2017
comment
Потому что вы отредактировали свой ответ, не добавив примечания/вклада. Так что никто не знал, что вы действительно исправили свой ответ. - person David Arenburg; 23.07.2017

В дополнение к ответам выше, версия data.table:

setDT(df)

unique_dt = unique(df, by = c('var1', 'var2'))
person Zaki    schedule 19.04.2020