我有一个创建新行的自定义函数,它从第一行复制数据并在特定列中添加等于数字的行。现在,如果每个 id 只有一个数据条目,则该函数运行良好。我需要的是当数据对一个 id 有多行时,该函数才能工作。
我的数据包括 id,即个人 id;阶段,即人所处的阶段;开始/结束,即开始和结束日期;MonthDiff 是开始日期和结束日期之间的差异,以及等于 0 或 1 的 Censor。
我需要按阶段对函数进行分组,并将行向下复制等于该阶段的月份差异,然后重新启动。
到目前为止我所拥有的:
df<-data.frame(id=c('A','A','A'),
Stage=c(1,2,3),
Start=c(as.Date('2014-01-01'),as.Date('2016-01-01'),as.Date('2019-01-01')),
End=c(as.Date('2015-12-31'),as.Date('2018-12-31'),as.Date('2020-02-01')),
MonthDiff=c(23,35,13),
Censor=c(0,0,1))
PLPP <- function(data, id,Stage, period, event)
{stopifnot(is.matrix(data) || is.data.frame(data))
stopifnot(c(id, period, event) %in% c(colnames(data), 1:ncol(data)))
if (any(is.na(data[, c(id, period, event)]))) {
stop("PLPP cannot currently handle missing data in the id, period, or event variables")
}
period = {
index <- rep(1:nrow(data), data[, period])
idmax<-cumsum(data[, period])
reve <- !data[, event]
dat <- data[index, ]
dat[, period] <- ave(dat[, period], dat[, id], FUN = seq_along)
dat[, event] <- 0
dat[idmax, event] <- reve}
rownames(dat) <- NULL
return(dat)
}
tpp<-PLPP(df,id='id',Stage = 'Stage',period = 'MonthDiff',event = 'Censor')
test<-df%>%group_by(Stage)%>%do(tpp)
我对当前代码的问题是 group_by 语句没有在新阶段重新启动。
我尝试过的一些参考资料:如何在函数中使用 group_by; 在函数中使用 dplyr group_by