[r] 벡터에서 x 값을 가진 요소 수 계산

숫자로 구성된 벡터가 있습니다.

numbers <- c(4,23,4,23,5,43,54,56,657,67,67,435,
         453,435,324,34,456,56,567,65,34,435)

R이 값 x 가 벡터에 나타나는 횟수를 어떻게 계산할 수 있습니까?



답변

당신은 사용할 수 있습니다 table():

> a <- table(numbers)
> a
numbers
  4   5  23  34  43  54  56  65  67 324 435 453 456 567 657
  2   1   2   2   1   1   2   1   2   1   3   1   1   1   1 

그런 다음 하위 집합을 만들 수 있습니다.

> a[names(a)==435]
435
  3

또는 더 편안하게 작업하려면 data.frame으로 변환하십시오.

> as.data.frame(table(numbers))
   numbers Freq
1        4    2
2        5    1
3       23    2
4       34    2
...


답변

가장 직접적인 방법은 sum(numbers == x)입니다.

numbers == xx가 발생하는 모든 위치에서 TRUE 인 논리 형 벡터를 생성하고, suming 일 때 논리 형 벡터를 숫자로 강제 변환하여 TRUE를 1로, FALSE를 0으로 변환합니다.

그러나 부동 소수점 숫자의 경우 다음과 같은 것을 사용하는 것이 좋습니다 sum(abs(numbers - x) < 1e-6).


답변

아마 이런 식으로 할 것

length(which(numbers==x))

하지만 더 좋은 방법은

table(numbers)


답변

패키지 도 count(numbers)있습니다 plyr. table제 생각 보다 훨씬 편리합니다 .


답변

내가 선호하는 솔루션은을 사용 rle하여 값 ( x예 : 레이블 )과 길이 를 반환합니다. 이 길이는 해당 값이 순서대로 나타난 횟수를 나타냅니다.

rle와 결합 sort하면 값이 나타나는 횟수를 세는 매우 빠른 방법이 있습니다. 보다 복잡한 문제에 도움이 될 수 있습니다.

예:

> numbers <- c(4,23,4,23,5,43,54,56,657,67,67,435,453,435,324,34,456,56,567,65,34,435)
> a <- rle(sort(numbers))
> a
  Run Length Encoding
    lengths: int [1:15] 2 1 2 2 1 1 2 1 2 1 ...
    values : num [1:15] 4 5 23 34 43 54 56 65 67 324 ...

당신이 원하는 값이 표시되지 않습니다, 또는 나중에에 그 값을 저장해야하는 경우, 확인 adata.frame.

> b <- data.frame(number=a$values, n=a$lengths)
> b
    values n
 1       4 2
 2       5 1
 3      23 2
 4      34 2
 5      43 1
 6      54 1
 7      56 2
 8      65 1
 9      67 2
 10    324 1
 11    435 3
 12    453 1
 13    456 1
 14    567 1
 15    657 1

모든 값이 아닌 하나의 값의 빈도를 알고 싶어하는 경우는 드물며 rle은 모든 값을 세고 저장하는 가장 빠른 방법 인 것 같습니다.


답변

R에는 표준 기능이 있습니다.

tabulate(numbers)


답변

numbers <- c(4,23,4,23,5,43,54,56,657,67,67,435 453,435,324,34,456,56,567,65,34,435)

> length(grep(435, numbers))
[1] 3


> length(which(435 == numbers))
[1] 3


> require(plyr)
> df = count(numbers)
> df[df$x == 435, ]
     x freq
11 435    3


> sum(435 == numbers)
[1] 3


> sum(grepl(435, numbers))
[1] 3


> sum(435 == numbers)
[1] 3


> tabulate(numbers)[435]
[1] 3


> table(numbers)['435']
435
  3


> length(subset(numbers, numbers=='435'))
[1] 3