计算出现次数

问题描述:

我遇到以下问题。我想计算小于或等于零的值的出现次数。以下数据中的示例我有3次出现1(0,0,0),2(-1,-2),3(0,0)。 R中是否有函数的构建来计算连续出现的次数。计算出现次数

a <- c(2,4,5,3,2,4,7,0,0,0,4,3,2,-1,-2,3,2,0,0,4) 
+2

@Jaap OP工作似乎要计算运行数项目

+0

在这种情况下,我有7次发生。我不想总结小于或等于零的值,但是在本例中的系列中出现的数字3 – kelamahim

可以使用rle

> sum(rle(a<=0)$values) 
[1] 3 

说明:

rle断载体引入运行其是> 0或< = 0。$values要么truefalse这取决于是否或者没有相应的运行符合谓词(a <= 0)或其否定。你想对应的值TRUE的运行,如果要算次操作,值低于零的号码的功能sum要挟那些TRUE s到1

:这给

sum(rle(a <= 0)$values) 

[1] 3 

这是如何工作:

  • 使用rle函数可创建a <= 0的游程长度编码。
  • rle(a <= 0)输出是:

    Run Length Encoding 
        lengths: int [1:7] 7 3 3 2 2 2 1 
        values : logi [1:7] FALSE TRUE FALSE TRUE FALSE TRUE ... 
    
  • 现在,你只需要求和rle -object值部分:

    > sum(rle(a <= 0)$values) 
    [1] 3 
    
+0

是否可以使用rle作为逻辑值?要计算TRUE和FALSE的出现次数? – kelamahim

+0

@kelamahim你的意思是像'rl Jaap

+0

我的输出看起来像:TRUE TRUE TRUE FALSE FALSE TRUE,如此算的真发生,在这种情况下,我有2个 – kelamahim

这里是另一种选择(不重复相同的东西)使用rleid

library(data.table) 
uniqueN(rleid(a<=0)[a<=0]) 
#[1] 3 

rleid给出的逻辑矢量(a <=0),子集与逻辑矢量([a<=0])的ID,并找到unique ID的lengthuniqueN


或者一个base R的游程长度-ID方法是

sum(diff(a <=0)==1) 
#[1] 3 
+0

我怎么能忘了'rleid' ;-) – Jaap

+0

BTW:'总和(DIFF(A Jaap

使用rle接受的答案是好的,但这里的另一种方式来做到这一点:

b <- a <= 0 
sum(b) - sum(b[which(b) - 1]) 

此计数非正元件的数量,并减去的多少的这些是由非正元件前面(所以只有非阳性的每次运行的开始结束了贡献计数。)

我做了一个快速测试,发现它对于大型载体(1000万到300万个元素)运行速度快几倍。

v1 <- function(a) sum(rle(a<=0)$values) 

v2 <- function(a) { 
    b <- a <= 0 
    sum(b) - sum(b[which(b) - 1]) 
} 

v1.time <- NULL 
v2.time <- NULL 
sizes <- 1:30 * 1E7 
for (s in sizes) { 
    x <- sample(-100:100, s, replace = TRUE) 

    v1.time <- c(v1.time, system.time(
    v1.result <- v1(x) 
)[['elapsed']]) 

    v2.time <- c(v2.time, system.time(
    v2.result <- v2(x) 
)[['elapsed']]) 

    print(c(v1.result, v2.result)) # Show that they agree 
    print(v1.time) 
    print(v2.time) 
} 

library(tidyverse) 
data.frame(VectorSize = sizes, 
      v1 = v1.time, 
      v2 = v2.time) %>% 
    gather('Version', 'Time', -VectorSize) %>% 
    ggplot(aes(x = VectorSize, y = Time, color = Version)) + geom_point() + geom_smooth() 

enter image description here

+0

不错的选择! – Jaap

在这个例子中我怎么指望在所有复制所有出现的?

set.seed(3) 
b<-c(4,6,4,2,3) 
run<- replicate(2,{ 
a <- runif(5,3,5) 
dif <- a - b 
return(dif) 
}) 
run 
[,1]  [,2] 
[1,] -0.6639169 0.2087881 
[2,] -1.3849672 -2.7507331 
[3,] -0.2301153 -0.4107982 
[4,] 1.6554686 2.1552198 
[5,] 1.2042013 1.2619585 

当我尝试

sum(rle(run<=0)$values) 

我得到

Error in rle(run <= 0) : 'x' must be a vector of an atomic type 

,但它与

uniqueN(rleid(run<=0)[run<=0])