计算vector中x值的元素数量

我有一个数字vector:

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 == x创build一个逻辑向量,在x出现的每个位置都为TRUE,当sum ,逻辑向量被强制为数字,将TRUE转换为1,将FALSE转换为0。

但是,请注意,对于浮点数最好使用像sum(abs(numbers - x) < 1e-6)

我可能会做这样的事情

 length(which(numbers==x)) 

但是真的,更好的方法是

 table(numbers) 

我的首选解决scheme使用rle ,它将返回一个值(在您的示例中的标签, x )和一个长度,这表示该值按顺序出现了多less次。

通过与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 ... 

如果您想要的值没有显示,或者您需要稍后存储该值,请创build一个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 

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

还有从plyrcount(numbers) 。 在我看来,比table更方便。

R中有一个标准函数

tabulate(numbers)

这里有一个快速和肮脏的方式:

 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 

您可以在随后的行中将数字更改为任何您想要的数字

 length(which(numbers == 4)) 

我发现方便的另一种方法是:

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

这将数据集转换为因子,然后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 

使用表格,但不与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)

 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