Как я могу найти номера трасс в списке? - PullRequest
0 голосов
/ 07 июня 2018

У меня есть список под названием «бросок» с бросками 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 голосов
/ 07 июня 2018

2 других способа:

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
0 голосов
/ 07 июня 2018

Выходные данные 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]]

data

toss <- c(0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...