我有以下问题 . 我想计算小于或等于零的值的出现次数 . 在以下数据中的示例我有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)
你可以使用 rle :
rle
> sum(rle(a<=0)$values) [1] 3
说明:
rle 将向量分解为> 0或<= 0的运行. $values 是 true 或 false ,具体取决于相应的运行是否满足谓词( a <= 0 )或其否定 . 您希望运行对应于值 TRUE ,函数 sum 将那些 TRUE 强制转换为1 .
$values
true
false
a <= 0
TRUE
sum
如果要计算值低于零的运行次数:
sum(rle(a <= 0)$values)
这使:
[1] 3
这是如何工作的:
使用 rle 函数可以创建 a <= 0 的游程长度编码 .
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 ...
> sum(rle(a <= 0)$values) [1] 3
这是使用 rleid 的另一个选项(不重复相同的东西)
rleid
library(data.table) uniqueN(rleid(a<=0)[a<=0]) #[1] 3
rleid 给出逻辑向量的运行长度id( a <=0 ),使用逻辑向量( [a<=0] )对id进行子集,并使用 uniqueN 找到 unique 的 length
a <=0
[a<=0]
uniqueN
unique
length
或者是 base R 方法
base R
sum(diff(a <=0)==1) #[1] 3
使用 rle 接受的答案很好,但这是另一种方法:
b <- a <= 0 sum(b) - sum(b[which(b) - 1])
这会计算非正元素的数量,并减去其中有多少元素在非正元素之前的数量(因此每次非正数运行的开始只会产生贡献 . )
我做了一个快速测试,发现对于大型载体(1000万到3亿个元素),运行速度要快几倍 .
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()
在此示例中,如何计算所有复制中的所有事件?
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])
5 回答
你可以使用
rle
:说明:
rle
将向量分解为> 0或<= 0的运行.$values
是true
或false
,具体取决于相应的运行是否满足谓词(a <= 0
)或其否定 . 您希望运行对应于值TRUE
,函数sum
将那些TRUE
强制转换为1 .如果要计算值低于零的运行次数:
这使:
这是如何工作的:
使用
rle
函数可以创建a <= 0
的游程长度编码 .rle(a <= 0)
的输出是:rle
-object的值部分求和:这是使用
rleid
的另一个选项(不重复相同的东西)rleid
给出逻辑向量的运行长度id(a <=0
),使用逻辑向量([a<=0]
)对id进行子集,并使用uniqueN
找到unique
的length
或者是
base R
方法使用
rle
接受的答案很好,但这是另一种方法:这会计算非正元素的数量,并减去其中有多少元素在非正元素之前的数量(因此每次非正数运行的开始只会产生贡献 . )
我做了一个快速测试,发现对于大型载体(1000万到3亿个元素),运行速度要快几倍 .
在此示例中,如何计算所有复制中的所有事件?
当我尝试
我明白了
但它正在努力