首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >根据给定变量识别连续序列

根据给定变量识别连续序列
EN

Stack Overflow用户
提问于 2020-04-13 12:04:08
回答 2查看 118关注 0票数 7

我真的被困在这上面了。df1有以下变量:

  1. serial =人群
  2. id1 =该群体中的人(如。12 (serial) 1 (id1) =群12 person 1; 12 2 = group 12 person 2, etc.)
  3. 'Day'when第一次(或开始)录音已经完成。

日数为相同数目的观察(例如95)

代码语言:javascript
运行
复制
        day1 (Monday)  =  day11-day196 
        day2 (Tuesday) = day21-day296     
        day3 (Wednesday) =  day31-day396   
        day4 (Thursday) =  day41-day496   
        day5 (Friday) = day51-day596      
        day6 (Saturday) = day61-day696   
        day7 (Sunday) =  day71-day796  

df1实例

代码语言:javascript
运行
复制
serial id1  Day     day1 day2 day3 day4 day5 day6 day7
12      1   Monday    2    1    2    1    1    3    1
123     1   Tuesday   0    3    0    3    3    0    3
10      1   Wednesday 0    3    3    3    3    3    3

我想指出连续的记录(每天的记录之间没有差距)和记录的总数。

连续录音的起始日是“日”变量。例如,连续记录为12次。记录开始于周一,每周至少有一次记录(从95个变量中至少有一个)。在这一周期间(7x95变量)记录了11个记录。

一个非连续的记录将是id 123,因为在day3和day6上有一个间隙日。纪录从周二开始,周三和周六有空档。

最后,我想记录一下连续录音的持续时间。

样本输出:

代码语言:javascript
运行
复制
 serial  id1   Duration Occurance        Days
12       1      11        7        day1 day2 day3 day4 day5 day6 day7
123      1      12        0        0
10       1      18        5        day3 day4 day5 day6 day7

样本数据

代码语言:javascript
运行
复制
structure(list(serial = c(12, 123, 10), id1 = c(1, 1, 1), Day = structure(1:3, .Label = c("Monday",
"Tuesday", "Wednesday"), class = "factor"), day1 = c(2, 0, 0),
day2 = c(1, 3, 3), day3 = c(2, 0, 3), day4 = c(1, 3, 3),
day5 = c(1, 3, 3), day6 = c(3, 0, 3), day7 = c(1, 3, 3)), row.names = c(NA,
3L), class = "data.frame")

相似岗位R - identify consecutive sequences

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-04-13 23:20:21

我们可以使用rleiddata.table得到‘发生’的正确。

代码语言:javascript
运行
复制
library(data.table)
wkdays <- c("Monday", "Tuesday", "Wednesday", "Thursday", 
"Friday", "Saturday", "Sunday")

out1 <-  do.call(rbind, Map(function(x, y) {
              i1 <- match(y, wkdays): length(x)
              i2 <- x[i1] != 0
              i3 <- all(i2)
              grp1 <- rleid(i2)
              Days <- if(i3) tapply(names(x)[i1][i2], grp1[i2], FUN = paste, collapse= ' ') else ''
             Occurance <- if(i3) length(grp1[i2]) else 0
             data.frame(Occurance, Days)
            }, asplit(df[-(1:3)], 1), df$Day))

 out1$Duration <- rowSums(df1[startsWith(names(df1), 'day')])
 out1
 # Occurance                               Days Duration
 #1         7 day1 day2 day3 day4 day5 day6 day7       11
 #2         0                                          12
 #3         5           day3 day4 day5 day6 day7       18
票数 1
EN

Stack Overflow用户

发布于 2020-04-13 12:29:29

你可以利用leadlag of dplyr

我试过了,结果是:

代码语言:javascript
运行
复制
library(dplyr)

df %>% 
    select(serial, contains("day", ignore.case = FALSE)) %>% 
    group_by(serial) %>% 
    tidyr::gather(day, val, -serial) %>% 
    # convert to binary 
    mutate(occur = ifelse(val > 0, 1, 0)) %>% 
    # if detect a seq, add cumulative, else 0
    mutate(cums = ifelse(lead(occur) > 0 & lag(occur) > 0 & occur > 0, 
                         occur + cumsum(occur), 0)) %>% 
    summarise(occurance = max(cums, na.rm = T), duration = sum(val))
代码语言:javascript
运行
复制
# A tibble: 3 x 3
  serial occurance duration
   <dbl>     <dbl>    <dbl>
1     10         6       18
2     12         7       11
3    123         0       12
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61187493

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档