最近在工作中遇到统计数据的问题,简单来说就是统计对象的频数,当然大部分人都会选择用table(),但其实还有很多简单实用的方法,根据网上的资源,现在收集整理如下:
> numbers <- c(1,1,1,4,4,5,6,6,8,8,10,15,15,17,18,21,21,453,435,324,34,456,56,567,65,34,435)
> as.data.frame(table(numbers)) ##用as.data.frame()函数把对象变成数据框,这样看起来比较方便
numbers Freq
1 1 3
2 4 2
3 5 1
4 6 2
5 8 2
6 10 1
7 15 2
8 17 1
9 18 1
10 21 2
11 34 2
12 56 1
13 65 1
14 324 1
15 435 2
16 453 1
17 456 1
18 567 1
> a <- rle(sort(numbers))###这个函数是统计向量或者等价值的长度
> a
Run Length Encoding
lengths: int [1:18] 3 2 1 2 2 1 2 1 1 2 ...
values : num [1:18] 1 4 5 6 8 10 15 17 18 21 ...
> data.frame(number=a$values, n=a$lengths)
number n
1 1 3
2 4 2
3 5 1
4 6 2
5 8 2
6 10 1
7 15 2
8 17 1
9 18 1
10 21 2
11 34 2
12 56 1
13 65 1
14 324 1
15 435 2
16 453 1
17 456 1
18 567 1
> s<-summary (as.factor(numbers)) ####这个方法就更简单了,先把向量转换为因子类型,直接一个summary()搞定。
> as.data.frame(cbind(Number = names(s),Freq = s), row.names = 1:length(s))
Number Freq
1 1 3
2 4 2
3 5 1
4 6 2
5 8 2
6 10 1
7 15 2
8 17 1
9 18 1
10 21 2
11 34 2
12 56 1
13 65 1
14 324 1
15 435 2
16 453 1
17 456 1
18 567 1
> library(plyr) ###这个需要调用plyr包中的函数count,plyr功能极其强大,可用”数据加工厂“一词形容,它会把一个大问题拆分成可以操作的小问题,独立对小问题进行运算。
> count(numbers)
x freq
1 1 3
2 4 2
3 5 1
4 6 2
5 8 2
6 10 1
7 15 2
8 17 1
9 18 1
10 21 2
11 34 2
12 56 1
13 65 1
14 324 1
15 435 2
16 453 1
17 456 1
18 567 1