假设我有一个包含两列或更多列的数据帧df,是否有一种简单的方法可以使用unique()
或其他R函数来创建两列或更多列的唯一组合的子集?
我知道我可以使用sqldf()
并编写一个简单的"SELECT DISTINCT var1, var2, ... varN"
查询,但我正在寻找一种R方式来做到这一点.
我想到尝试ftable强制转换为数据帧并使用字段名称,但我也得到了数据集中不存在的组合的交叉表:
uniques <- as.data.frame(ftable(df$var1, df$var2))
Run Code Online (Sandbox Code Playgroud)
Mar*_*rek 41
unique
适用于data.frame
所以unique(df[c("var1","var2")])
应该是你想要的.
另一种选择是distinct
来自dplyr
包装:
df %>% distinct(var1, var2) # or distinct(df, var1, var2)
Run Code Online (Sandbox Code Playgroud)
注意:
对于旧版本的dplyr(< 0.5.0,2016-06-24 ),distinct
需要额外的步骤
df %>% select(var1, var2) %>% distinct
Run Code Online (Sandbox Code Playgroud)
(或古老的方式distinct(select(df, var1, var2))
).
@Marek的答案显然是正确的,但可能已过时。当前的dplyr版本(0.7.4)允许使用更简单的代码:
只需使用:
df %>% distinct(var1, var2)
Run Code Online (Sandbox Code Playgroud)
如果要保留所有列,请添加
df %>% distinct(var1, var2, .keep_all = TRUE)
Run Code Online (Sandbox Code Playgroud)
要保留 df 中的所有其他变量,请使用以下命令:
unique_rows <- !duplicated(df[c("var1","var2")])
unique.df <- df[unique_rows,]
Run Code Online (Sandbox Code Playgroud)
另一种不太推荐的方法是使用 row.names() #(见下面大卫的评论):
unique_rows <- row.names(unique(df[c("var1","var2")]))
unique.df <- df[unique_rows,]
Run Code Online (Sandbox Code Playgroud)