我有数字向量:

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发生的每个位置,和当suming,逻辑矢量被强制到数字它转换到TRUE 1和FALSE 0。

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

我可能会做这样的事

length(which(numbers==x))

但事实上,更好的办法是

table(numbers)

有也被从包count(numbers) plyr。远远高于在我看来table更方便。

我的优选解决方案使用rle,这将返回一个值(标签,x在你的例子)和长度,其表示该值多少次出现在序列。

通过rlesort结合,你有一个非常快速的方法来计算的任何值出现的次数。这可以是更复杂的问题有所帮助。

示例:

> 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 = `==`))
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top