提问



我有一个数字向量:


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


如何计算值 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
...

其它参考1


最直接的方式是sum(numbers == x)


numbers == x创建一个逻辑向量,在x出现的每个位置都为TRUE,当sum时,逻辑向量被强制转换为数字,将TRUE转换为1,将FALSE转换为0。


但请注意,对于浮点数,最好使用类似:sum(abs(numbers - x) < 1e-6)之类的东西。

其它参考2


我可能会做这样的事情


length(which(numbers==x))


但实际上,更好的方法是


table(numbers)

其它参考3


来自plyr包的count(numbers)也有。在我看来比table方便得多。

其它参考4


我的首选解决方案使用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设为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似乎是获得计数和存储它们的最快方法。

其它参考5


R中有一个标准函数


tabulate(numbers)

其它参考6


这是一个快速而又肮脏的方式:


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

其它参考7


如果要随后计算出现次数,可以使用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

其它参考8


您可以在下一行中将数​​字更改为您想要的任何数字


length(which(numbers == 4))

其它参考9


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

其它参考10


我觉得方便的另一种方法是:


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 


如果愿意,可以将其存储为数据帧。



  as.data.frame(cbind(Number=names(s),Freq=s),stringsAsFactors=F,row.names=1:length(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

其它参考11


使用表但不与names比较:


numbers <- c(4,23,4,23,5,43,54,56,657,67,67,435)
x <- 67
numbertable <- table(numbers)
numbertable[as.character(x)]
#67 
# 2 


当您多次使用不同元素的计数时,table非常有用。如果您只需要一个计数,请使用sum(numbers == x)