2010-05-24 6 views
20

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

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

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

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

ответ

34

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

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

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

(или старенькая путь distinct(select(df, var1, var2))).

-2

сохранить все другие переменные используются ф.р. это:

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,] 
+2

No. Operating над рядом имена всегда плохая идея. Просто используйте 'duplicated', если вам нужен логический вектор. –

+0

Я не уверен, почему он был проголосован. – sbaniwal

+0

Потому что вы отредактировали свой ответ, не добавляя никаких примечаний/вкладов. Поэтому никто не знал, что вы на самом деле исправили свой ответ. –

0

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

Просто использовать:

df %>% distinct(var1, var2) 

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

df %>% distinct(var1, var2, .keep_all = TRUE) 
Смежные вопросы