Đếm số lần xuất hiện cho mỗi giá trị duy nhất


140

Hãy nói rằng tôi có:

v = rep(c(1,2, 2, 2), 25)

Bây giờ, tôi muốn đếm số lần mỗi giá trị duy nhất xuất hiện. unique(v) trả về giá trị duy nhất là bao nhiêu, nhưng không phải là bao nhiêu.

> unique(v)
[1] 1 2

Tôi muốn một cái gì đó mang lại cho tôi

length(v[v==1])
[1] 25
length(v[v==2])
[1] 75

nhưng như một lớp lót tổng quát hơn :) Một cái gì đó gần (nhưng không hoàn toàn) như thế này:

#<doesn't work right> length(v[v==unique(v)])

Câu trả lời:


179

Có lẽ bảng là những gì bạn đang sau?

dummyData = rep(c(1,2, 2, 2), 25)

table(dummyData)
# dummyData
#  1  2 
# 25 75

## or another presentation of the same data
as.data.frame(table(dummyData))
#    dummyData Freq
#  1         1   25
#  2         2   75

7
À, vâng, tôi có thể sử dụng cái này, với một vài sửa đổi nhỏ: t (as.data.frame (bảng (v)) [, 2]) chính xác là những gì tôi cần, cảm ơn bạn
gakera

1
Tôi đã từng làm điều này vụng về với hist. tablecó vẻ khá chậm hơn một chút hist. Tôi tự hỏi tại sao. Bất cứ ai có thể xác nhận?
Hồi giáo

2
Đuổi theo, bất kỳ cơ hội để đặt hàng theo tần số? Tôi có cùng một vấn đề, nhưng bảng của tôi có khoảng 20000 mục và tôi muốn biết mức độ thường xuyên của các mục phổ biến nhất.
Torvon

5
@Torvon - chắc chắn, chỉ cần sử dụng order()vào kết quả. tức làx <- as.data.frame(table(dummyData)); x[order(x$Freq, decreasing = TRUE), ]
Đuổi theo

Phương pháp này không tốt, nó chỉ phù hợp với rất ít dữ liệu với nhiều lần lặp lại, nó sẽ không phù hợp với nhiều dữ liệu liên tục với một vài bản ghi trùng lặp.
Sâu Bắc

26

Nếu bạn có nhiều yếu tố (= khung dữ liệu đa chiều), bạn có thể sử dụng dplyrgói để đếm các giá trị duy nhất trong mỗi kết hợp các yếu tố:

library("dplyr")
data %>% group_by(factor1, factor2) %>% summarize(count=n())

Nó sử dụng toán tử đường ống %>%để gọi các phương thức chuỗi trên khung dữ liệu data.


21

Đó là một cách tiếp cận một dòng bằng cách sử dụng aggregate.

> aggregate(data.frame(count = v), list(value = v), length)

  value count
1     1    25
2     2    75

11

Hàm bảng () là một cách tốt để đi, như Chase đề xuất. Nếu bạn đang phân tích một tập dữ liệu lớn, một cách khác là sử dụng hàm .N trong gói dữ liệu.

Hãy chắc chắn rằng bạn đã cài đặt gói bảng dữ liệu bằng cách

install.packages("data.table")

Mã số:

# Import the data.table package
library(data.table)

# Generate a data table object, which draws a number 10^7 times  
# from 1 to 10 with replacement
DT<-data.table(x=sample(1:10,1E7,TRUE))

# Count Frequency of each factor level
DT[,.N,by=x]

8

Để có được một vectơ số nguyên không có kích thước có chứa số lượng giá trị duy nhất, hãy sử dụng c().

dummyData = rep(c(1, 2, 2, 2), 25) # Chase's reproducible data
c(table(dummyData)) # get un-dimensioned integer vector
 1  2 
25 75

str(c(table(dummyData)) ) # confirm structure
 Named int [1:2] 25 75
 - attr(*, "names")= chr [1:2] "1" "2"

Điều này có thể hữu ích nếu bạn cần đưa số lượng giá trị duy nhất vào một hàm khác và ngắn hơn và thành ngữ hơn so với t(as.data.frame(table(dummyData))[,2]bài đăng trong một nhận xét cho câu trả lời của Chase. Cảm ơn Ricardo Saporta, người đã chỉ ra điều này cho tôi ở đây .


7

Điều này làm việc cho tôi. Lấy véc tơ của bạnv

length(summary(as.factor(v),maxsum=50000))

Nhận xét: đặt maxsum đủ lớn để thu được số lượng giá trị duy nhất

hoặc với magrittrgói

v %>% as.factor %>% summary(maxsum=50000) %>% length


4

Nếu bạn cần có số lượng giá trị duy nhất dưới dạng một cột bổ sung trong khung dữ liệu chứa các giá trị của bạn (ví dụ, một cột có thể biểu thị kích thước mẫu), plyr cung cấp một cách gọn gàng:

data_frame <- data.frame(v = rep(c(1,2, 2, 2), 25))

library("plyr")
data_frame <- ddply(data_frame, .(v), transform, n = length(v))

3
hoặc ddply(data_frame, .(v), count). Cũng đáng làm cho nó rõ ràng rằng bạn cần một library("plyr")cuộc gọi để thực hiện ddplycông việc.
Brian Diggs

Có vẻ lạ khi sử dụng transformthay vì mutatekhi sử dụng plyr.
Gregor Thomas

3

Cũng làm cho các giá trị phân loại và gọi summary()sẽ làm việc.

> v = rep(as.factor(c(1,2, 2, 2)), 25)
> summary(v)
 1  2 
25 75 

2

Bạn cũng có thể thử tidyverse

library(tidyverse) 
dummyData %>% 
    as.tibble() %>% 
    count(value)
# A tibble: 2 x 2
  value     n
  <dbl> <int>
1     1    25
2     2    75

0

Nếu bạn muốn chạy duy nhất trên data.frame (ví dụ: train.data) và cũng có được số đếm (có thể được sử dụng làm trọng số trong phân loại), bạn có thể làm như sau:

unique.count = function(train.data, all.numeric=FALSE) {                                                                                                                                                                                                 
  # first convert each row in the data.frame to a string                                                                                                                                                                              
  train.data.str = apply(train.data, 1, function(x) paste(x, collapse=','))                                                                                                                                                           
  # use table to index and count the strings                                                                                                                                                                                          
  train.data.str.t = table(train.data.str)                                                                                                                                                                                            
  # get the unique data string from the row.names                                                                                                                                                                                     
  train.data.str.uniq = row.names(train.data.str.t)                                                                                                                                                                                   
  weight = as.numeric(train.data.str.t)                                                                                                                                                                                               
  # convert the unique data string to data.frame
  if (all.numeric) {
    train.data.uniq = as.data.frame(t(apply(cbind(train.data.str.uniq), 1, 
      function(x) as.numeric(unlist(strsplit(x, split=","))))))                                                                                                    
  } else {
    train.data.uniq = as.data.frame(t(apply(cbind(train.data.str.uniq), 1, 
      function(x) unlist(strsplit(x, split=",")))))                                                                                                    
  }
  names(train.data.uniq) = names(train.data)                                                                                                                                                                                          
  list(data=train.data.uniq, weight=weight)                                                                                                                                                                                           
}  

0

chiều dài (duy nhất (df $ col)) là cách đơn giản nhất mà tôi có thể thấy.


R có lẽ đã phát triển rất nhiều trong 10 năm qua, kể từ khi tôi hỏi câu hỏi này.
gakera

-2
count_unique_words <-function(wlist) {
ucountlist = list()
unamelist = c()
for (i in wlist)
{
if (is.element(i, unamelist))
    ucountlist[[i]] <- ucountlist[[i]] +1
else
    {
    listlen <- length(ucountlist)
    ucountlist[[i]] <- 1
    unamelist <- c(unamelist, i)
    }
}
ucountlist
}

expt_counts <- count_unique_words(population)
for(i in names(expt_counts))
    cat(i, expt_counts[[i]], "\n")
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.