我有一个名为' toss' 100枚硬币投掷。折腾[[1]]给了我这个(只是例子)
0 1 0 0 1 1 1 0 0 0 1 1 0 1
我想知道我的跑步次数。
在这种情况下,它应该给我8,因为:
0 | 1 | 0 0 | 1 1 1 | 0 0 0 | 1 1 | 0 | 1 - > 8次运行
由于我有100次投掷,我需要计算每次投掷的运行次数(R)。
我该怎么做?
我尝试使用rle()函数,但它没有工作。
答案 0 :(得分:3)
import java.time.LocalDate, java.time.format.DateTimeFormatter
DateTimeFormatter.ofPattern("yyyy/MM").format(LocalDate.now)
的输出是rle
和list
的名为lengths
。
values
提取str(rle(toss))
#List of 2
# $ lengths: int [1:8] 1 1 2 3 3 2 1 1
# $ values : num [1:8] 0 1 0 1 0 1 0 1
# - attr(*, "class")= chr "rle"
或lengths
并获取values
length
函数length(rle(toss)$lengths)
将获得每个lengths
元素的length
,然后提取第一个长度
list
lengths(rle(toss))[[1]]
答案 1 :(得分:1)
其他两种方式:
sum(vec[-1]!=vec[-length(vec)])+1
# [1] 8
sum(abs(diff(vec)))+1
# [1] 8
两者基本上都是计算变化并添加1。
他们加快了一点:
toss <- sample(0:1,1000000,replace = T)
library(microbenchmark)
microbenchmark(
rle_ = lengths(rle(toss))[[1]],
diff_ = sum(abs(diff(toss)))+1,
uneq = sum(toss[-1]!=toss[-length(toss)])+1,
unit = "relative"
)
# Unit: relative
# expr min lq mean median uq max neval
# rle_ 3.050793 4.797267 2.2994769 1.827826 2.170513 1.0883327 100
# diff_ 1.485904 1.456412 0.8871846 1.132103 1.119984 0.2089307 100
# uneq 1.000000 1.000000 1.0000000 1.000000 1.000000 1.0000000 100