मेरे पास प्रारंभ और समाप्ति तिथियों के साथ डेटा है, और यदि वे एक साथ "श्रृंखला" करते हैं तो उन्हें उसी घटना का हिस्सा होना चाहिए।

A <- data.frame(group = c("A", "A", "B", "C", "C", "C", "D", "D", "D", "E", "E", "E", "E"),
           startdate = c("2019-01-01", "2019-01-03", "2019-01-25", "2019-01-19", "2019-01-20", "2019-01-22", "2019-01-09", "2019-01-11", "2019-01-27", "2019-01-02", "2019-01-03", "2019-01-09", "2019-01-12"),
           enddate = c("2019-01-03", "2019-01-05", "2019-01-26", "2019-01-20", "2019-01-22", "2019-01-23", "2019-01-11", "2019-01-12", "2019-02-01", "2019-01-03", "2019-01-05", "2019-01-12", "2019-01-13")) %>% 
  mutate(outcome = c(runif(nrow(.))))
A
  group  startdate    enddate     outcome
1      A 2019-01-01 2019-01-03 0.955011991
2      A 2019-01-03 2019-01-05 0.476095975
3      B 2019-01-25 2019-01-26 0.005301758
4      C 2019-01-19 2019-01-20 0.179261809
5      C 2019-01-20 2019-01-22 0.688228826
6      C 2019-01-22 2019-01-23 0.248906204
7      D 2019-01-09 2019-01-11 0.151737360
8      D 2019-01-11 2019-01-12 0.503649969
9      D 2019-01-27 2019-02-01 0.310691439
10     E 2019-01-02 2019-01-03 0.152001235
11     E 2019-01-03 2019-01-05 0.434751253
12     E 2019-01-09 2019-01-12 0.510411369
13     E 2019-01-12 2019-01-13 0.214607322

मैं जो चाहता हूं वह एक और कॉलम है जो एक ईवेंट आईडी देता है:

  group  startdate    enddate     outcome eventID
1      A 2019-01-01 2019-01-03 0.955011991       1
2      A 2019-01-03 2019-01-05 0.476095975       1
3      B 2019-01-25 2019-01-26 0.005301758       1
4      C 2019-01-19 2019-01-20 0.179261809       1
5      C 2019-01-20 2019-01-22 0.688228826       1
6      C 2019-01-22 2019-01-23 0.248906204       1
7      D 2019-01-09 2019-01-11 0.151737360       1
8      D 2019-01-11 2019-01-12 0.503649969       1
9      D 2019-01-27 2019-02-01 0.310691439       2
10     E 2019-01-02 2019-01-03 0.152001235       1
11     E 2019-01-03 2019-01-05 0.434751253       1
12     E 2019-01-09 2019-01-12 0.510411369       2
13     E 2019-01-12 2019-01-13 0.214607322       2

फिर मैं एक नया व्यक्ति-ईवेंट आईडी बना सकता हूं और उस नई आईडी से परिणाम जोड़ सकता हूं।

मेरे पास अभी एकमात्र समाधान एक ही समूह के लिए दो "जंजीर" घटनाओं से निपट नहीं सकता है (उदाहरण में समूह ई)

library(tidyverse)
A %>% 
  group_by(group) %>% 
  mutate(datediff = as.Date(startdate) - lag(as.Date(enddate))) %>% 
  mutate(eventID = ifelse(is.na(datediff)|datediff == 0, 1,n())) %>% 
  mutate(newID = paste0(group, eventID)) %>% 
  group_by(newID) %>% 
  summarise(outcome = sum(outcome))

यह इस सवाल के समान है, लेकिन डेटा एक समय श्रृंखला नहीं हैं।

r
1
Liam 19 अक्टूबर 2021, 22:34

1 उत्तर

सबसे बढ़िया उत्तर

हम 'eventID' बनाने के बाद cumsum का उपयोग कर सकते हैं

library(dplyr)
A %>% 
  group_by(group) %>% 
  mutate(datediff = as.Date(startdate) - lag(as.Date(enddate))) %>%  
  mutate(eventID = ifelse(is.na(datediff)|datediff == 0, 1,n()), 
         eventID = 1 + cumsum(eventID != 1), datediff = NULL) %>%
  ungroup

आउटपुट

# A tibble: 13 × 5
   group startdate  enddate    outcome eventID
   <chr> <chr>      <chr>        <dbl>   <dbl>
 1 A     2019-01-01 2019-01-03  0.0589       1
 2 A     2019-01-03 2019-01-05  0.460        1
 3 B     2019-01-25 2019-01-26  0.506        1
 4 C     2019-01-19 2019-01-20  0.157        1
 5 C     2019-01-20 2019-01-22  0.303        1
 6 C     2019-01-22 2019-01-23  0.200        1
 7 D     2019-01-09 2019-01-11  0.117        1
 8 D     2019-01-11 2019-01-12  0.851        1
 9 D     2019-01-27 2019-02-01  0.340        2
10 E     2019-01-02 2019-01-03  0.0618       1
11 E     2019-01-03 2019-01-05  0.645        1
12 E     2019-01-09 2019-01-12  0.764        2
13 E     2019-01-12 2019-01-13  0.537        2
1
akrun 19 अक्टूबर 2021, 22:38