【发布时间】:2018-08-23 07:38:26
【问题描述】:
我需要计算特定时间段内特定事件的发生次数。假设我有以下数据:
set.seed(1453)
id = c(1,1,1,1,1,2,2,2,2,2)
x_1 = sample(0:1, 10, TRUE)
x_5 = sample(0:1, 10, TRUE)
date = c('2016-01-01',
'2016-02-01',
'2016-02-23',
'2016-03-04',
'2016-04-01',
'2016-01-01',
'2016-02-01',
'2016-02-23',
'2016-03-04',
'2016-04-01'
)
df = data.frame(id,date=as.Date(date),snapshot_date = as.Date(date)+1,x_1,x_5)
表 1.(输入)
id date snapshot_date x_1 x_5
1 2016-01-01 2016-01-02 1 0
1 2016-02-01 2016-02-02 0 1
1 2016-02-23 2016-02-24 1 1
1 2016-03-04 2016-03-05 0 0
1 2016-04-01 2016-04-02 0 1
2 2016-01-01 2016-01-02 1 1
2 2016-02-01 2016-02-02 1 0
2 2016-02-23 2016-02-24 0 0
2 2016-03-04 2016-03-05 0 0
2 2016-04-01 2016-04-02 1 1
我需要计算在过去 3 个月内(每个月)发生了多少次 x_1=1 和 x_5=1。所以我首先创建虚拟变量:如果 x_1 =1,则 x_1_n = TRUE。否则,x_1_n = FALSE。同样,对于 x_5_n。我还创建了倒退三个月的日期。
df$x_1_n <- ifelse((df$x_1 ==1), TRUE, FALSE)
df$x_5_n <- ifelse(df$x_5==1, TRUE, FALSE)
library(lubridate)
for (i in 1:3) {
DATE_MO <- as.Date(df$snapshot_date) %m-% months(i)
df[,paste0("DATE_MO", i)] <- DATE_MO
}
我有变量 x_1、x_5。我需要编写一个循环来遍历所有这些变量 x_1,x_5 并计算某些日期之间的出现次数。原始代码运行并且是正确的。但我想看看如何使用 for 循环来简化它,这样我就不必手动复制粘贴每个 x_1 和 x_5 的代码,因为原始版本中 x_ 和日期的数量更大。
library(data.table)
df <- data.table(df)
df[,c("x1_dminus_mo1",
"x1_dminus_mo2",
"x1_dminus_mo3"
) :=. (df[x_1_n][df[,.(id,DATE_MO1,snapshot_date)], on=.
(id, date >= DATE_MO1, date < snapshot_date), .N, by = .EACHI] $N
,
df[x_1_n][df[,.(id,DATE_MO2, DATE_MO1)], on=.
(id, date >= DATE_MO2, date < DATE_MO1), .N, by = .EACHI] $N
,
df[x_1_n][df[,.(id,DATE_MO3, DATE_MO2)], on=.
(id, date >= DATE_MO3, date < DATE_MO2), .N, by = .EACHI] $N
)]
df[,c("x5_dminus_mo1",
"x5_dminus_mo2",
"x5_dminus_mo3"
) :=. (df[x_5_n][df[,.(id,DATE_MO1,snapshot_date)], on=.
(id, date >= DATE_MO1, date < snapshot_date), .N, by = .EACHI] $N
,
df[x_5_n][df[,.(id,DATE_MO2, DATE_MO1)], on=.
(id, date >= DATE_MO2, date < DATE_MO1), .N, by = .EACHI] $N
,
df[x_5_n][df[,.(id,DATE_MO3, DATE_MO2)], on=.
(id, date >= DATE_MO3, date < DATE_MO2), .N, by = .EACHI] $N
)]
我想得到下表但使用循环。
表 2(输出)
df[,c(1,2,4,11,12,13)]
id date x_1 x1_dminus_mo1 x1_dminus_mo2 x1_dminus_mo3
1 2016-01-01 1 1 0 0
1 2016-02-01 0 0 1 0
1 2016-02-23 1 1 1 0
1 2016-03-04 0 1 0 1
1 2016-04-01 0 0 1 0
2 2016-01-01 1 1 0 0
2 2016-02-01 1 1 1 0
2 2016-02-23 0 1 1 0
2 2016-03-04 0 0 1 1
2 2016-04-01 1 1 0 1
【问题讨论】:
-
由于已添加更多详细信息,请重新打开此问题。
-
我想你在
get命令之后使用由字符串和变量组成的变量,但我真的不明白你在这里期望做什么...... -
谢谢你,天思白。我需要这样做: for (i in c("x_1", "x_5")) { 然后编写代码,以便我在 x_1 和 x_5 上有循环}
-
可能类似于
col = "x_1"; DT[, .SD[.(1), on=col][.(d_dn = date - 31, d_up = date), on=.(date >= d_dn, date <= d_up), .N, by=.EACHI]$N]
标签: r loops data.table