使用R从数据框中提取唯一值

15

我有一个含有多列的数据帧,我想要选取其中两列,并且计算唯一值的总数...这是一个例子:

比如说我有一个名为df的数据帧:

df<- data.frame(v1 = c(1, 2, 3, 2, "a"), v2 = c("a", 2 ,"b","b", 4))
df

  v1 v2
1  1  a
2  2  2
3  3  b
4  2  b
5  a  4

现在我要做的是从这两列中提取唯一值。如果我只对每列使用unique()函数,输出将如下所示:

> unique(df[,1])
[1] 1 2 3 a
> unique(df[,2])
[1] a 2 b 4
但这样做不太好,因为它只能找到每列的唯一值,而我需要计算两列中所有唯一值的总数!例如,'a'在两列中都重复出现,但是我只想让它被计数一次。对于我所需的示例输出,请想象将列V1和V2放在彼此上方,如下所示:
  V1_V2
1      1
2      2
3      3
4      2
5      a
6      a
7      2
8      b
9      b
10     4

V1_V2的唯一值将是:

   V1_V2
1      1
2      2
3      3
5      a
8      b
10     4

那么我只需使用nrow()函数来计算行数。你有什么想法如何实现这个呢?


6
unique(unlist(df))的意思是将数据框df中所有不重复的值提取出来并展平为一个向量。但要注意,当混合不同类型的值时会进行强制转换,因此可能会影响数据的准确性。 - joran
1
unique(c(df[,1],df[,2] )) - dww
5个回答

14

采用这种方法,您可以获得唯一值,无论您有多少列:

df2 <- as.vector(as.matrix(df))
unique(df2)

然后,只需使用 length

14

这非常适合使用union

data.frame(V1_V2=union(df$v1, df$v2))

#  V1_V2
#1     1
#2     2
#3     3
#4     a
#5     b
#6     4

2
这正是我想要做的...我之前写了大约15行代码,而你只用了1行就实现了...谢谢! - Electrino

2

试试这个:

unique(c(df[,1], df[,2]))

0

library(dplyr)

df %>% distinct(v1, .keep_all=TRUE)


1
你的回答可以通过提供更多支持性信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人能够确认你的回答是否正确。你可以在帮助中心找到关于如何撰写好回答的更多信息。 - Community

0

一种通用的方法:

uq_elem=c()
for(i in 1:ncol(df))
{
  uq_elem=c(unique(df[,i]), uq_elem)
  uq_elem=unique(uq_elem)
}

所有不同的元素将在:uq_elem 中。


2
虽然这段代码片段可能解决了问题,但包括解释真的有助于提高您的帖子质量。请记住,您正在为未来的读者回答问题,而这些人可能不知道您的代码建议原因。 - 31piy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接