함수 - 갯수 in r




벡터에서 x의 값을 가진 원소의 수를 세는 것 (8)

나는 숫자의 벡터가있다 :

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 가 나타나는 횟수를 어떻게 계산합니까?


R에는 표준 함수가 있습니다.

tabulate(numbers)


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

numbers == x 는 x가 발생하는 모든 위치에서 TRUE 인 논리 벡터를 생성하고 sum 하면 TRUE를 1로, FALSE를 0으로 변환하는 숫자로 강제 변환됩니다.

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


내가 찾은 또 다른 방법은 다음과 같습니다.

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

이렇게하면 데이터 집합이 factor로 변환 된 다음 summary ()가 제어 총계 (고유 값의 수)를 제공합니다.

출력은 다음과 같습니다.

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 

원하는 경우 데이터 프레임으로 저장할 수 있습니다.

stringAsFactors = F, row.names = 1 : length (s)) as.data.frame (cbind (Number = 이름, Freq = s)

row.names는 행 이름의 이름을 바꾸는 데 사용되었습니다. row.names를 사용하지 않고 s의 열 이름이 새 데이터 프레임에서 행 이름으로 사용됩니다.

출력은 다음과 같습니다.

     Number Freq
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

다음 행에서 원하는 번호로 번호를 변경할 수 있습니다.

length(which(numbers == 4))

여기 하나 빠르고 빠르다.

x <- 23
length(subset(numbers, numbers==x))

이후에 나타나는 횟수를 계산하려면 다음과 같이 sapply 함수를 사용할 수 있습니다.

index<-sapply(1:length(numbers),function(x)sum(numbers[1:x]==numbers[x]))
cbind(numbers, index)

산출:

        numbers index
 [1,]       4     1
 [2,]      23     1
 [3,]       4     2
 [4,]      23     2
 [5,]       5     1
 [6,]      43     1
 [7,]      54     1
 [8,]      56     1
 [9,]     657     1
[10,]      67     1
[11,]      67     2
[12,]     435     1
[13,]     453     1
[14,]     435     2
[15,]     324     1
[16,]      34     1
[17,]     456     1
[18,]      56     2
[19,]     567     1
[20,]      65     1
[21,]      34     2
[22,]     435     3

필자가 선호하는 솔루션은 rle 을 사용합니다. rle 은 값 (레이블에서 x 는 귀하의 예제에서)과 길이를 나타냅니다.이 길이는 해당 값이 순서대로 표시된 횟수를 나타냅니다.

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

예:

> 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 ...

원하는 값이 표시되지 않거나 나중에 값을 저장해야하는 a a data.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은 계산하고 저장하는 가장 빠른 방법 인 것처럼 보인다.


plyr 패키지의 count(numbers) 있습니다. 내 의견으로는 table 보다 훨씬 편리 table .





r-faq