使用向量中的x值计算元素的数量

RQu*_*ons 378 r vector count r-faq

我有一个数字向量:

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

如何计算值x在向量中出现的次数?

Sha*_*ane 473

你可以使用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 
Run Code Online (Sandbox Code Playgroud)

然后你可以将它子集化:

> a[names(a)==435]
435 
  3
Run Code Online (Sandbox Code Playgroud)

或者如果您更熟悉它,请将其转换为data.frame:

> as.data.frame(table(numbers))
   numbers Freq
1        4    2
2        5    1
3       23    2
4       34    2
...
Run Code Online (Sandbox Code Playgroud)

  • 不要忘记潜在的浮点问题,特别是对于将数字强制转换为字符串的表. (20认同)
  • 这是一个很好的观点.这些都是整数,所以在这个例子中它不是一个真正的问题,对吧? (4认同)
  • 为什么不是'a ["435"]`而不是'a [names(a)== 435]`? (4认同)

had*_*ley 248

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

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

但请注意,对于浮点数,最好使用以下内容:sum(abs(numbers - x) < 1e-6).

  • @Jason虽然它确实直接回答了这个问题,但我的猜测是人们喜欢更通用的解决方案,它为数据中的所有"x"提供了答案,而不是特定的已知值"x".公平地说,这就是最初的问题.正如我在下面的回答中所说,"我发现我很少想知道一个值的频率,而不是所有值..." (3认同)

小智 55

我可能会做这样的事情

length(which(numbers==x))
Run Code Online (Sandbox Code Playgroud)

但实际上,更好的方法是

table(numbers)
Run Code Online (Sandbox Code Playgroud)

  • `table(numbers)`比最简单的解决方案`sum(numbers == x)`做更多的工作,因为它也会计算出列表中所有其他数字的计数. (10认同)

geo*_*ory 38

也有count(numbers)plyr包.比table我看来更方便.


JBe*_*ker 33

我的首选解决方案使用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 ...
Run Code Online (Sandbox Code Playgroud)

如果您想要的值没有显示,或者您需要存储该值以供日后使用,请创建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
Run Code Online (Sandbox Code Playgroud)

我发现我很少想知道一个值的频率而不是所有的值,并且rle似乎是最快的计数和存储它们的方法.


Ser*_*jev 19

R中有一个标准函数

tabulate(numbers)

  • 但是您可以处理给定数字的零个实例,而其他解决方案则无法处理 (2认同)

JD *_*ong 9

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

x <- 23
length(subset(numbers, numbers==x))
Run Code Online (Sandbox Code Playgroud)


小智 9

如果要随后计算出现次数,可以使用以下sapply功能:

index<-sapply(1:length(numbers),function(x)sum(numbers[1:x]==numbers[x]))
cbind(numbers, index)
Run Code Online (Sandbox Code Playgroud)

输出:

        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
Run Code Online (Sandbox Code Playgroud)


ish*_*007 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
Run Code Online (Sandbox Code Playgroud)


小智 7

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

length(which(numbers == 4))
Run Code Online (Sandbox Code Playgroud)


tmf*_*mnk 6

一种选择是使用库vec_count()中的函数vctrs

vec_count(numbers)

   key count
1  435     3
2   67     2
3    4     2
4   34     2
5   56     2
6   23     2
7  456     1
8   43     1
9  453     1
10   5     1
11 657     1
12 324     1
13  54     1
14 567     1
15  65     1
Run Code Online (Sandbox Code Playgroud)

默认排序将最常见的值放在顶部。如果寻找根据键排序(table()类似输出):

vec_count(numbers, sort = "key")

   key count
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
Run Code Online (Sandbox Code Playgroud)