背景
我有一個R資料框d:
d <- data.frame(ID = c("a","a","b","b", "c","c","c"),
event = c(1,1,0,0,1,1,1),
event_date = as.Date(c("2011-01-01","2012-08-21","2011-12-23","2011-12-31","2013-03-14","2013-04-07","2014-07-14")),
stringsAsFactors=FALSE)
如您所見,ID列中有 3 個不同的人,他們有或沒有event,以及他們的事件狀態記錄的日期 ( event_date)。
問題
我想創建一個新變數/列,如果在第一個=1的 180 天內有 2 個或更多=1,則將event_within_interval1 分配給給定的所有單元格。IDIDevent event
讓我進一步解釋一下:兩者ID=a都有ID=c2 個或更多事件,但只有在第一個事件的 180 天內ID=c有第二個ID=c事件(所以在這里,2013 年 4 月 7 日 - 2013 年 3 月 14 日 = 24 天)。
問題是我不確定如何說出R“如果第二次發生在第一次發生的 180 天內”的想法event=1。
我想要什么
這就是我要找的東西:
want <- data.frame(ID = c("a","a","b","b","c","c","c"),
event = c(1,1,1,0,0,1,1),
event_date = as.Date(c("2011-01-01","2012-08-21","2011-12-23","2011-12-31","2013-03-14","2013-04-07","2014-07-14")),
event_within_interval = c(0,0,0,0,1,1,1),
stringsAsFactors=FALSE)
我試過的
到目前為止,我才剛剛開始嘗試:
d <- d %>%
mutate(event_within_interval = ID %in% if_else(d$event == 1, 1, 0))
但這并沒有給我我想要的東西,因為你可以知道你是否運行代碼。
我已經將它設定為if_else,但我不確定從這里去哪里。
更新:我已經編輯了兩個可重現的示例(我擁有什么以及我想要什么),以強調所需的日期間隔需要在第一個事件和第二個事件之間,而不是第一個事件和最后一個事件之間。(幾個用戶使用 提交了示例last,該示例適用于可重現示例的先前迭代,但不適用于真實資料集。)
uj5u.com熱心網友回復:
包lubridate和data.table呢?
library(data.table)
library(lubridate)
d <- data.frame(ID = c("a","a","b","b", "c","c"),
event = c(1,1,0,0,1,1),
event_date = as.Date(c("2011-01-01","2012-08-21","2011-12-23","2011-12-31","2013-03-14","2013-04-07")),
stringsAsFactors=FALSE)
d <- data.table(d)
d <- d[, event_within_interval := 0]
timeInterval <- interval(start = "2013-03-14", end = "2013-04-07")
d <- d[event == 1 & event_date %within% timeInterval, event_within_interval := 1]
d
# ID event event_date event_within_interval
# 1: a 1 2011-01-01 0
# 2: a 1 2012-08-21 0
# 3: b 0 2011-12-23 0
# 4: b 0 2011-12-31 0
# 5: c 1 2013-03-14 1
# 6: c 1 2013-04-07 1
uj5u.com熱心網友回復:
這很好玩。
方案 1
我的方法是
- 分組活動
ID - 在當前日期和初始日期之間的兩天內應用第一個條件檢查
- 檢查事件的總和是否大于或等于兩個:
sum(event) >= 2 - 只有滿足這兩個條件,我才會為活動回傳一個
為了便于閱讀,我將資料中的條件值作為test_*變數回傳。
d %>%
group_by(ID) %>%
mutate(test_interval = event_date - min(event_date) < 180,
test_sum_events = sum(event) >= 2,
event_within_interval = if_else(test_interval & test_sum_events,
1, 0)) %>%
ungroup()
方案 2
在這種情況下,資料按event_date范圍內排序,ID第一個事件和第二個事件之間的差異必須小于 180 天。其余事件被忽略。
d %>%
group_by(ID) %>%
arrange(event_date) %>%
mutate(
# Check the difference between first event: min(event_date) and
# second event: event_date[2]
test_interval_first_two = event_date[2] - min(event_date) <= 180,
test_sum_events = sum(event) >= 2,
event_within_interval = if_else(
test_interval_first_two & test_sum_events, 1, 0)
) %>%
ungroup()
uj5u.com熱心網友回復:
您可以先group_by列ID,以便我們可以計算同一天數ID。然后在if_else陳述句中的條件中,使用帶有sum() > 1AND 天差的條件<= 180。
在這里,我假設每個ID.
library(dplyr)
d %>%
group_by(ID) %>%
mutate(event_within_interval = if_else(sum(event) > 1 & last(event_date) - first(event_date) <= 180, 1L, 0L))
# A tibble: 6 x 4
# Groups: ID [3]
ID event event_date event_within_interval
<chr> <dbl> <date> <int>
1 a 1 2011-01-01 0
2 a 1 2012-08-21 0
3 b 0 2011-12-23 0
4 b 0 2011-12-31 0
5 c 1 2013-03-14 1
6 c 1 2013-04-07 1
uj5u.com熱心網友回復:
這是我們如何做到的。在這個例子中用一個額外的列interval來查看區間然后使用一個ifelse陳述句。
library(dpylr)
d %>%
group_by(ID) %>%
mutate(interval = last(event_date)- first(event_date),
event_within_interval = ifelse(event == 1 &
interval < 180, 1, 0))
ID event event_date interval event_within_interval
<chr> <dbl> <date> <drtn> <dbl>
1 a 1 2011-01-01 598 days 0
2 a 1 2012-08-21 598 days 0
3 b 0 2011-12-23 8 days 0
4 b 0 2011-12-31 8 days 0
5 c 1 2013-03-14 24 days 1
6 c 1 2013-04-07 24 days 1
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/434260.html
上一篇:洗掉數字月份前面的額外0
