Процент продолжительности дезактивации в R - PullRequest
0 голосов
/ 28 февраля 2019

Я хочу вычислить процент продолжительности деактивации системы.Активация указана в столбце «Активный», где 1 означает активацию, а 0 - деактивацию.Наблюдения (строки) соответствуют различным показаниям из разных систем, идентифицированным по их «идентификатору».«Время» каждого чтения указывается в метках времени.Вот образец данных, которые я имею в таблице.

ID Timestamp Active
64 1512743947      1
74 1512743963      1
76 1512743978      1
80 1512743992      0
22 1512744041      1
74 1512744155      1
80 1512744175      1
51 1512744240      1
80 1512744266      0
80 1512744275      1

Я следовал за ответом на мой вопрос здесь: Извлечь продолжительность изменения в R .Но я понял, что сумма разницы временных меток не приведет меня туда, где я хочу быть.Чтобы было ясно, в качестве ответа я хотел бы, чтобы общий процент времени, потраченного каждым идентификатором, был деактивирован, что означает от 0 до 1 (не от 1 до 0).

ID Percentage
80 67%

1 Ответ

0 голосов
/ 28 февраля 2019

Вы можете попробовать:

library(dplyr)

df %>%
  group_by(ID) %>%
  filter(n_distinct(Active) > 1) %>%
  mutate(time_diff = lead(Timestamp) - Timestamp) %>%
  summarise(
    Percentage = scales::percent(sum(time_diff[Active == 0], na.rm = T) / sum(time_diff, na.rm = T))
  )

Вывод:

# A tibble: 1 x 2
     ID Percentage
  <int> <chr>     
1    80 67.8%    

Здесь я предположил на основе вашего вывода, что вы хотели бы отфильтровать те случаи, когда это либо100% или 0%.

В противном случае вы можете сделать:

df %>%
  group_by(ID) %>%
  mutate(time_diff = lead(Timestamp) - Timestamp) %>%
  mutate(
    Percentage = sum(time_diff[Active == 0], na.rm = T) / sum(time_diff, na.rm = T),
    Percentage = scales::percent(coalesce(Percentage, +(Active == 0) * 1))
  ) %>% 
  distinct(ID, Percentage)

Выход:

# A tibble: 6 x 2
# Groups:   ID [6]
     ID Percentage
  <int> <chr>     
1    64 0%        
2    74 0%        
3    76 0%        
4    80 67.8%     
5    22 0%        
6    51 0%       
...