【发布时间】:2019-03-26 23:04:10
【问题描述】:
披露 - 这是我的第一个 SO 问题,如果这是一个重复的问题,我深表歉意,但我已经寻找了一段时间,还没有找到这个特定情况的答案
R 版本:3.4.2
我想要一种通过特定标识符对数据进行分组的有效方法,然后根据条件进行汇总 - 为每一行动态地进行汇总。具体来说,如果另一个实例在当前行的 1 年内,则按 ID 分组,然后总结另一个变量发生的实例数(紧急访问)。
以下是数据开始的示例:
更新为包含 2 个紧急案例的示例
library(lubridate)
> dat <- data.frame("ID" = c(6,6,6,7,7,10,11,11,11),
"Admit_Dt" = as.Date(c('2013-08-12', '2013-12-12', '2016-01-03','2011-04-01', '2011-09-20','2012-02-19','2014-06-24','2014-08-12','2014-09-01')),
"Urgent" = c(0,1,1,1,0,0,1,1,1))
> dat
| ID | Admit_Dt | Urgent|
| 6 | 2013-08-12 | 1|
| 6 | 2013-12-12 | 0|
| 6 | 2016-01-03 | 1|
| 7 | 2011-04-01 | 1|
| 7 | 2011-09-20 | 0|
| 10 | 2012-02-19 | 0|
| 11 | 2014-06-24 | 1|
| 11 | 2014-08-12 | 1|
| 11 | 2014-09-01 | 1|
我想首先按 ID 分组,然后总结给定组的每个 Admit_Dt 一年内发生的紧急访问次数。
下面这个过于复杂的代码会产生我想要的东西,但是我正在使用的数据集非常大,而且效率很低。我很好奇是否有一种方法使用“dplyr”来实现我想要做的事情:
> dat$Urgent_1yrSum <- unlist(sapply(1:length(unique(dat$ID)), function(i) {
grouped <- subset(dat, ID == unique(dat$ID)[i])
output <- do.call(rbind, lapply(1:nrow(grouped), function(y){
urgent_sum_1year <- sum(grouped[grouped$Admit_Dt < grouped$Admit_Dt[y] & grouped$Admit_Dt > (grouped$Admit_Dt[y] - dyears(1)), "Urgent"])
}))
return(output)
}
))
> dat
| ID | Admit_Dt | Urgent| Urgent_1yrSum|
| 6 | 2013-08-12 | 1| 0|
| 6 | 2013-12-12 | 0| 1|
| 6 | 2016-01-03 | 1| 0|
| 7 | 2011-04-01 | 1| 0|
| 7 | 2011-09-20 | 0| 1|
| 10 | 2012-02-19 | 0| 0|
| 11 | 2014-06-24 | 1| 0|
| 11 | 2014-08-12 | 1| 1|
| 11 | 2014-09-01 | 1| 2|
感谢您的帮助!!
【问题讨论】:
-
我在尝试您的代码时收到错误
Error in e1 + (-e2) : non-numeric argument to binary operator -
我认为出现错误是因为 Admit_Dt 在示例数据中没有被构造为日期类。我在创建 df 时添加了“as.Date”。
-
你确定你的最后一行是正确的吗?应该改为 2014-09-01 的 admission_dt 吗?
-
更新了!抱歉,制作虚假数据比提出实际问题更难哈哈。
标签: r dplyr data-manipulation lubridate