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)
had*_*ley 248
最直接的方式是sum(numbers == x).
numbers == x创建一个逻辑向量,在x出现的每个位置都为TRUE,当suming时,逻辑向量被强制转换为numeric,将TRUE转换为1,将FALSE转换为0.
但请注意,对于浮点数,最好使用以下内容:sum(abs(numbers - x) < 1e-6).
小智 55
我可能会做这样的事情
length(which(numbers==x))
Run Code Online (Sandbox Code Playgroud)
但实际上,更好的方法是
table(numbers)
Run Code Online (Sandbox Code Playgroud)
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似乎是最快的计数和存储它们的方法.
小智 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)
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)
一种选择是使用库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)
| 归档时间: |
|
| 查看次数: |
1034641 次 |
| 最近记录: |