簡體   English   中英

R - 數據框列中唯一值的數量

[英]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.framelength調用對象類data.frame計算該對象中的data.frame數,即 1,而df[,"some_col"]返回一個vectorvector 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM