Сколько раз вектор идет от 0 до ненулевого - PullRequest
0 голосов
/ 04 декабря 2018

Допустим, у меня есть вектор типа hours <- c( 200,200,0,0,0,100,100,100,0,100), и я хочу подсчитать, сколько раз он идет от 0 до ненулевого значения.

Например, мы могли бы сделать

starts<-0
for(i in 1:(length(hours)-1)) {
  if(hours[i]==0 & hours[i+1]!=0) starts<-starts+1
}

Это не очень похоже на R, есть ли лучший способ?

Ответы [ 4 ]

0 голосов
/ 04 декабря 2018

Вы можете использовать diff.

sum(diff(hours != 0) == 1) 
# [1] 2

Объяснение:

Количество различий (sum) (diff) в "ненулевом" (!= 0) существовании (== 1).

0 голосов
/ 04 декабря 2018

Вы можете использовать rle:

hours <- c( 200,200,0,0,0,100,100,100,0,100)
runs <- rle(hours)
sum(runs$values == 0) - ifelse(tail(hours,1) == 0,1,0)
#evaluates to 2

Логика заключается в том, что число переходов от 0 является числом нетерминальных прогонов 0.

0 голосов
/ 04 декабря 2018

Аналогично ответу Джордо, но без использования дополнительной библиотеки.

sum(hours[1:(length(hours)-1)]==0&hours[2:(length(hours))]!=0)

0 голосов
/ 04 декабря 2018
library(tidyverse)
sum(hours == 0 & lead(hours) != 0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...