首页 > 解决方案 > 矩阵中的区间数

问题描述

我有一个包含 3523 个观察值和 92 个变量的数据框。

下面是一个有 6 个数据框的例子;观察的 24 小时记录从凌晨 4:00 开始,到凌晨 4:00 结束。

  04:00   04:15   04:30 05:00  ...  04:35
1  -       -     -       -     ...  -
2  2       2     2       -     ...  -
3  2       -     -       2     ...  -
4  -       -     2       -     ...  -
5  -       -     -       -     ...  -
6  -       -     -       -     ...  2 

每行包含值“-”和“2”。

我想提取以“2”开头的间隔的开头和结尾

For example 2: 04:15-04:30; 
            3: 04:00 ; 05:00
            4: 04:30 

谢谢

标签: rmatrixtimeextracttail

解决方案


让我们扩展一下您的示例。在扩展的示例中,我们可以注意到2第 1 行没有,并且还有一些更棘手的,例如第 6 行,我们有2,然后是一个 break ( ),然后是两个s-的序列,2一个-,然后又是一个2

    04:00 04:15 04:30 05:00 05:15 05:30
 1:     -     -     -     -     -     -
 2:     2     2     2     -     2     2
 3:     2     -     -     2     2     2
 4:     -     -     2     -     2     2
 5:     -     -     -     -     2     2
 6:     2     -     2     2     -     2
 7:     -     -     -     -     2     2
 8:     2     2     -     2     2     2
 9:     -     -     -     -     2     2
10:     2     2     -     2     2     2

如果您输入以下内容,您可以复制它:

WorkSchedulesDay1 <- structure(list(`04:00` = c("-", "2", "2", "-", "-", "2", "-", 
"2", "-", "2"), `04:15` = c("-", "2", "-", "-", "-", "-", "-", 
"2", "-", "2"), `04:30` = c("-", "2", "-", "2", "-", "2", "-", 
"-", "-", "-"), `05:00` = c("-", "-", "2", "-", "-", "2", "-", 
"2", "-", "2"), `05:15` = c("-", "2", "2", "2", "2", "-", "2", 
"2", "2", "2"), `05:30` = c("-", "2", "2", "2", "2", "2", "2", 
"2", "2", "2")), row.names = c(NA, -10L), class = c("data.table", 
"data.frame"))

之后,您应用代码:

WorkSchedulesDay1 <- WorkSchedulesDay1 %>% 
  group_by(rn = row_number()) %>% 
  gather(time, val, 1:6) %>%
  arrange(time) %>%
  mutate(tmp = cumsum(coalesce(val != lag(val), FALSE))) %>% arrange(rn) %>%
  filter(!val == "-") %>%
  group_by(rn, tmp) %>%
  mutate(
    time = case_when(
      n() > 1 ~ paste(min(time), max(time), sep = " - "),
      TRUE ~ time
    )
  ) %>%
  ungroup() %>% distinct(rn, tmp, time) %>%
  group_by(rn) %>%
  mutate(
    intervals = case_when(
      n() > 1 ~ paste(time, collapse = ", "),
      TRUE ~ time
    )
  ) %>% distinct(rn, intervals) %>%
  write_csv("WorkSchedulesDay1.csv")

你会看到你得到的是:

     rn intervals                   
  <int> <chr>                       
     2 04:00 - 04:30, 05:15 - 05:30
     3 04:00, 05:00 - 05:30        
     4 04:30, 05:15 - 05:30        
     5 05:15 - 05:30               
     6 04:00, 04:30 - 05:00, 05:30 
     7 05:15 - 05:30               
     8 04:00 - 04:15, 05:00 - 05:30
     9 05:15 - 05:30               
    10 04:00 - 04:15, 05:00 - 05:30

没有第 1 行的记录,只是因为那里只有-

同样,在第 2 行没有记录05:00,只是因为那里有一个-

以类似的方式,04:00, 04:30 - 05:00, 05:30第 6 行有 for ,因为有-for04:1505:15


推荐阅读