मेरे पास प्रारंभ और समाप्ति तिथियों के साथ डेटा है, और यदि वे एक साथ "श्रृंखला" करते हैं तो उन्हें उसी घटना का हिस्सा होना चाहिए।
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))
यह इस सवाल के समान है, लेकिन डेटा एक समय श्रृंखला नहीं हैं।
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