题
我有数字向量:
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
创建一个逻辑载体,其为TRUE在是x发生的每个位置,和当sum
ing,逻辑矢量被强制到数字它转换到TRUE 1和FALSE 0。
但是,请注意,浮点数,最好使用类似:sum(abs(numbers - x) < 1e-6)
我可能会做这样的事
length(which(numbers==x))
但事实上,更好的办法是
table(numbers)
有也被从包count(numbers)
plyr
。远远高于在我看来table
更方便。
我的优选解决方案使用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 ...
如果您想要的值显示不出来,或者你需要存储供以后该值,使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
我觉得这是罕见的,我想知道一个值,而不是所有的值的频率,和RLE似乎是得到计数和存储他们所有的最快方式。
有被设定为R一标准函数,该函数
tabulate(numbers)
这里有一个快速和肮脏的方式:
x <- 23
length(subset(numbers, 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
如果您想随后出场数的数量,你可以使用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))
使用表,但不与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)
(s<-summary (as.factor(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
如果优选这可以被存储为数据帧。
as.data.frame(cbind(总数=名字(一个或多个),频率= S),stringsAsFactors = F,row.names = 1:长度(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
有计数特定元素的不同的方式
library(plyr)
numbers =c(4,23,4,23,5,43,54,56,657,67,67,435,453,435,7,65,34,435)
print(length(which(numbers==435)))
#Sum counts number of TRUE's in a vector
print(sum(numbers==435))
print(sum(c(TRUE, FALSE, TRUE)))
#count is present in plyr library
#o/p of count is a DataFrame, freq is 1 of the columns of data frame
print(count(numbers[numbers==435]))
print(count(numbers[numbers==435])[['freq']])
这可以outer
做才能获得平等随后rowSums
的Metrix的,具有明显的意义。结果
为了在同一个数据集的计数和numbers
,首次创建data.frame。如果你想单独的输入和输出,则不需要此步骤。
df <- data.frame(No = numbers)
df$count <- rowSums(outer(df$No, df$No, FUN = `==`))