R - 数据帧列中的唯一值数

时间:2017-01-28 06:04:54

标签: r

对于数据框df,我需要找到some_col的唯一值。试过以下

length(unique(df["some_col"]))

但这并没有给出预期的结果。但是length(unique(some_vector))适用于矢量并提供预期结果。

创建df时的前面几个步骤

df <- read.csv(file, header=T)
typeof(df) #=> "list"
typeof(unique(df["some_col"])) #=> "list"
length(unique(df["some_col"])) #=> 1 

6 个答案:

答案 0 :(得分:3)

尝试使用[[代替[[会返回list(事实上data.frame),[[会返回vector

df <- data.frame( some_col = c(1,2,3,4),
                  another_col = c(4,5,6,7) )

length(unique(df[["some_col"]]))
#[1] 4

class( df[["some_col"]] )
[1] "numeric"

class( df["some_col"] )
[1] "data.frame"

您得到的值为1,因为list长度为1(1列),即使该1个元素包含多个值。

答案 1 :(得分:3)

你需要使用

length(unique(unlist(df[c("some_col")])))

当您通过df [c(&#34; some_col&#34;)]或df [&#34; some_col&#34;]调用列时;它把它作为一个列表。取消列表会将其转换为矢量,您可以轻松地使用它。当您通过df $ some_col调用column时,它会将数据列拉为vector

答案 2 :(得分:3)

我想你可能会错过, 尝试

length(unique(df[,"some_col"]))

回应评论:

df <- data.frame(cbind(A=c(1:10),B=rep(c("A","B"),5)))
df["B"]

输出:

B
1  A
2  B
3  A
4  B
5  A
6  B
7  A
8  B
9  A
10 B

length(unique(df[,"B"])) 

输出:

[1] 1

与OP发布的

相同的错误/不良输出

但是用逗号 ,

df[,"B"]

输出:

 [1] A B A B A B A B A B
Levels: A B

length(unique(df[,"B"])) 

现在OP为您提供正确/期望的输出。在这个例子中是2

[1] 2

原因是df["some_col"]调用data.framelength调用对象类data.frame计算该对象中的data.frames数量为1,而df[,"some_col"]会向vector返回lengthvector次调用,正确返回该向量中的元素数量。所以你看到逗号(,)会有所不同。

答案 3 :(得分:0)

这是另一种选择:

df %>% 
distinct(column_name) %>% 
count()

或没有tidyverse的内容:

count(distinct(df, column_name))

在网络中查看基准测试,您会发现distinct()很快。

答案 4 :(得分:0)

data.table包包含方便的速记 uniqueN 。从documentation

uniqueN在x是解剖向量时等于length(unique(x)),在x是data.frame或data.table时等于nrow(unique(x))。唯一行的数量是直接计算的,而无需实现中间唯一数据表,因此速度更快且存储效率更高。

您可以将其与数据框一起使用:

df <- data.frame(some_col = c(1,2,3,4),
                 another_col = c(4,5,6,7) )
data.table::uniqueN(df[['some_col']])

[1] 4

或者如果您已经有一个data.table

dt <- setDT(df)
dt[,uniqueN(some_col)]

[1] 4

答案 5 :(得分:0)

使用 tidyverse

df %>% 
  select("some_col") %>% 
  n_distinct()