각 고유 값에 대한 발생 횟수를 계산합니다.


140

내가 가지고 있다고 가정 해 봅시다.

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

이제 고유 한 값이 나타나는 횟수를 세고 싶습니다. unique(v) 고유 한 값을 반환하지만 그 값은 반환하지 않습니다.

> unique(v)
[1] 1 2

나에게주는 무언가를 원해

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

그러나 더 일반적인 one-liner로서 :) 다음과 같은 것이 (그러나 그렇지는 않습니다)

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

답변:


179

아마도 테이블은 당신이 무엇을하고 있습니까?

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
아, 그래, 나는 약간의 수정과 함께이를 사용할 수 있습니다 t (as.data.frame는 (표 (V)) [2]) 내가 필요 정확히, 감사합니다
gakera

1
나는 이것을 어색하게했었다 hist. table보다 약간 느린 것 같습니다 hist. 왜 그런지 궁금합니다. 누구든지 확인할 수 있습니까?
Museful

2
체이스, 주파수로 주문할 기회가 있습니까? 나는 똑같은 문제가 있지만 내 테이블에는 약 20000 개의 항목이 있으며 가장 일반적인 항목이 얼마나 자주 있는지 알고 싶습니다.
Torvon

5
@ Torvon- order()결과에 따라 사용하십시오 . 즉,x <- as.data.frame(table(dummyData)); x[order(x$Freq, decreasing = TRUE), ]
체이스

이 방법은 좋지 않으며 반복되는 데이터가 거의없는 데이터에만 적합하며 중복 된 레코드가 거의없는 연속 데이터에는 적합하지 않습니다.
Deep North

26

여러 요인 (= 다차원 데이터 프레임)이있는 경우 dplyr패키지를 사용하여 각 요인 조합에서 고유 한 값을 계산할 수 있습니다 .

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

파이프 연산자 %>%를 사용하여 데이터 프레임에서 메소드 호출을 연결합니다 data.


21

를 사용하여 한 줄로 접근합니다 aggregate.

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

  value count
1     1    25
2     2    75

11

Chase가 제안한 것처럼 table () 함수는 좋은 방법 입니다. 큰 데이터 집합을 분석하는 경우 다른 방법은 데이터 테이블 패키지에서 .N 함수를 사용하는 것입니다.

다음을 통해 데이터 테이블 패키지를 설치했는지 확인하십시오.

install.packages("data.table")

암호:

# 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().

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"

이것은 고유 한 값의 개수를 다른 함수에 제공 t(as.data.frame(table(dummyData))[,2]해야하며 체이스의 답변에 대한 주석에 게시 된 것보다 짧고 관용적 인 경우에 유용 할 수 있습니다 . 나에게이 점을 지적 리카르도 Saporta 덕분에 여기 .


7

이것은 나를 위해 작동합니다. 당신의 벡터를 가지고v

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

설명 : 고유 값의 수를 캡처 할 수있을 정도로 maxsum을 크게 설정하십시오.

또는 magrittr패키지 와 함께

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


4

값이 포함 된 데이터 프레임에 추가 열 (예 : 샘플 크기를 나타낼 수있는 열)로 고유 한 값의 개수가 필요한 경우 plyr는 다음과 같은 깔끔한 방법을 제공합니다.

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
또는 ddply(data_frame, .(v), count). 또한 일을하려면 library("plyr")전화가 필요하다는 점을 분명히 밝힐 가치가 ddply있습니다.
브라이언 딕스

를 사용할 때 transform대신 사용하는 것이 이상해 보입니다 . mutateplyr
Gregor Thomas

3

또한 범주 및 호출 값을 사용 summary()하면 효과가 있습니다.

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

2

당신은 또한 시도 할 수 있습니다 tidyverse

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

0

data.frame (예 : train.data)에서 고유하게 실행하고 개수 (분류기에서 가중치로 사용할 수 있음)를 얻으려면 다음을 수행하십시오.

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

length (unique (df $ col))는 내가 볼 수있는 가장 간단한 방법입니다.


이 질문을 한 이후 R은 지난 10 년 동안 많은 발전을 거듭했을 것입니다.
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")
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.