对于数据框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
答案 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.frame
和length
调用对象类data.frame
计算该对象中的data.frames数量为1,而df[,"some_col"]
会向vector
返回length
和vector
次调用,正确返回该向量中的元素数量。所以你看到逗号(,
)会有所不同。
答案 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()