如何在列表中找到运行次数?

时间:2018-06-06 21:26:40

标签: r count rstudio

我有一个名为' 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()函数,但它没有工作。

2 个答案:

答案 0 :(得分:3)

import java.time.LocalDate, java.time.format.DateTimeFormatter DateTimeFormatter.ofPattern("yyyy/MM").format(LocalDate.now) 的输出是rlelist的名为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