假设我有一个包含两列或更多列的数据框df,是否有一种简单的方法可以使用unique()
或其他R函数来创建两列或更多列的唯一组合的子集?
我知道我可以使用sqldf()
并编写一个简单的"SELECT DISTINCT var1, var2, ... varN"
查询,但我正在寻找一种R方式。
我突然想到 ftable 强制使用 dataframe 并使用字段名称,但我也得到了组合中不存在的组合的交叉表数据集:
uniques <- as.data.frame(ftable(df$var1, df$var2))
答案 0 :(得分:39)
unique
适用于data.frame
,因此unique(df[c("var1","var2")])
应该是您想要的。
另一个选项是来自dplyr
package的distinct
:
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))
)。
答案 1 :(得分:2)
@Marek的答案显然是正确的,但可能已经过时了。当前的dplyr版本(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'))