两个或多个字段/变量的R等效于SELECT DISTINCT

时间:2010-05-24 21:38:19

标签: sql r dataframe

假设我有一个包含两列或更多列的数据框df,是否有一种简单的方法可以使用unique()或其他R函数来创建两列或更多列的唯一组合的子集?

我知道我可以使用sqldf()并编写一个简单的"SELECT DISTINCT var1, var2, ... varN"查询,但我正在寻找一种R方式。

我突然想到 ftable 强制使用 dataframe 并使用字段名称,但我也得到了组合中不存在的组合的交叉表数据集:

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

4 个答案:

答案 0 :(得分:39)

unique适用于data.frame,因此unique(df[c("var1","var2")])应该是您想要的。

另一个选项是来自dplyr packagedistinct

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

注意:

对于旧版本的dplyr(< 0.5.0, 2016-06-24distinct需要额外的步骤

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

(或古老的方式distinct(select(df, var1, var2)))。

答案 1 :(得分:2)

@Marek的答案显然是正确的,但可能已经过时了。当前的版本(0.7.4)允许更简单的代码:

只需使用:

df %>% distinct(var1, var2)

如果要保留所有列,请添加

df %>% distinct(var1, var2, .keep_all = TRUE)

答案 2 :(得分:0)

要保留df中的所有其他变量,请使用:

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

unique.df <- df[unique_rows,]

另一个不太推荐的方法是使用row.names()#(参见下面David的评论):

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

unique.df <- df[unique_rows,]

答案 3 :(得分:0)

除了上面的答案,data.table版本:

setDT(df)

unique_dt = unique(df, by = c('var1', 'var2'))