计算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想知道一个数值的频率而不是所有的数值,而且似乎是最快的方法来统计和存储它们。
还有从plyr
包count(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