披露-这是我的第一个SO问题,如果这是重复问题,我深表歉意,但是我已经寻找了一段时间,但没有找到针对这种特定情况的答案
R版本:3.4.2
我想要一种按特定标识符对数据进行分组的有效方法,然后根据条件(针对每一行动态地)进行汇总。具体来说,按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|
感谢您的帮助!
答案 0 :(得分:4)
我无法使您的代码正常工作,所以我尝试查看是否可以使其正常工作。我首先加入内部,以按ID获取日期的所有组合。减去它们后,您可以使用过滤器查看在每个日期的一年内谁来了一次访问,然后是summarise
。
dat <- data.frame("ID" = c(6,6,6,7,7,10,11,11),
"Admit_Dt" = 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'),
"Urgent" = c(0,1,1,1,0,0,1,1),stringsAsFactors = FALSE)
library(dplyr)
dat2 <- inner_join(dat,select(dat,ID,Admit_Dt,Urgent),by = "ID") %>%
#Inner Join by ID to get every combo of dates
#Subtract dates from eachother
mutate(datediff = as.Date(Admit_Dt.x) - as.Date(Admit_Dt.y),
ID = ID) %>%
#get dates that occured within one year of visit
#for each date
filter(datediff > 0 & datediff <= 365) %>%
#group by person
group_by(ID,Admit_Dt.x) %>%
#count urgent visits
mutate(urgent_visits = max(Urgent.x,Urgent.y,na.rm=TRUE)) %>%
summarise(vs = sum(urgent_visits))
#Join back on to df
dat3 <- left_join(dat,dat2,by = c("ID" = "ID", "Admit_Dt"="Admit_Dt.x"))
答案 1 :(得分:1)
以下是使用class AnimalsTester:
from source import Animals
print Animals.dogs
print AnimalsTester.Animals.dogs
,列表列和dplyr
的答案。我假设没有重复的purrr
和ID
,否则我很确定这是行不通的。
Admit_Dt