[英]R - number of unique values in a column of data frame
對於數據幀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
嘗試使用[[
而不是[
。 [
返回一個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 個元素包含多個值。
你需要使用
length(unique(unlist(df[c("some_col")])))
當您通過 df[c("some_col")] 或 df["some_col"] 調用 column 時; 它把它作為一個列表。 Unlist 會將其轉換為矢量,您可以輕松使用它。 當您通過 df$some_col 調用 column .. 它將數據列拉為向量
我想你可能只是錯過了一個,
試試
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.frame
數,即 1,而df[,"some_col"]
返回一個vector
對vector
length
調用正確返回該vector
的元素數。 所以你會看到一個逗號 ( ,
) 使一切變得不同。
這是另一種選擇:
df %>%
distinct(column_name) %>%
count()
或者這個沒有tidyverse:
count(distinct(df, column_name))
檢查網絡中的基准測試,您會發現 distinct() 速度很快。
data.table 包包含方便的簡寫uniqueN 。 從文檔
當 x 是解剖向量時,uniqueN 等價於 length(unique(x)),當 x 是 data.frame 或 data.table 時,等價於 nrow(unique(x))。 唯一行的數量是直接計算的,無需具體化中間唯一的 data.table,因此速度更快,內存效率更高。
您可以將它與數據框一起使用:
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
使用 tidyverse
df %>%
select("some_col") %>%
n_distinct()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.