R中停用时间的百分比

时间:2019-02-28 14:34:00

标签: r tibble

我想计算系统被停用的持续时间的百分比。 激活在“活动”列中给出,其中1表示激活,0表示取消激活。观测值(行)对应于来自不同系统的“ ID”标识的不同读数。每个读数的“时间”以时间戳标识。 这是我详细介绍的数据示例。

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

我在这里回答了我的问题:Extract change duration in R。但是我发现,时间戳记差的总和不会使我到达想要的位置。明确地说,作为回应,我希望停用每个ID所花费的总时间百分比,即介于0和1(不是1和0)之间。

ID Percentage
80 67%

1 个答案:

答案 0 :(得分:1)

您可以尝试:

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%