我有一个数据框,其中包含一些关于何时附加到ID的行的观察结果。 我需要一段时间,每个ID都有一条线/导管连接。
这是我的输入回复:
structure(list(ID = c(487622L, 487622L, 487639L, 487639L, 489027L,
489027L, 489027L, 491858L, 491858L, 491858L, 491858L, 491858L,
491858L), Line = c("Central Venous Line", "Central Venous Line",
"Central Venous Line", "Peripherally Inserted Central Catheter (PICC)",
"Haemodialysis Catheter", "Peripherally Inserted Central Catheter (PICC)",
"Haemodialysis Catheter", "Central Venous Line", "Haemodialysis Catheter",
"Central Venous Line", "Haemodialysis Catheter", "Central Venous Line",
"Peripherally Inserted Central Catheter (PICC)"), Start = structure(c(1362528000,
1363219200, 1362268800, 1363219200, 1364774400, 1365120000, 1365465600,
1364688000, 1364688000, 1365724800, 1365724800, 1366848000, 1369353600
), class = c("POSIXct", "POSIXt"), tzone = "UTC"), End = structure(c(1362787200,
1363824000, 1363305600, 1363737600, 1365465600, 1366675200, 1365638400,
1365724800, 1365724800, 1366329600, 1366848000, 1367539200, 1369612800
), class = c("POSIXct", "POSIXt"), tzone = "UTC"), Days = c("3.095138889",
"7.045138889", "11.87777778", "5.736111111", "7.850694444", "18.02083333",
"1.813888889", "12.32986111", "12.71388889", "6.782638889", "13.14027778",
"7.718055556", "3.397222222"), dateOrder = c(1L, 2L, 1L, 2L,
1L, 2L, 3L, 1L, 2L, 3L, 4L, 5L, 6L)), .Names = c("ID", "Line",
"Start", "End", "Days", "dateOrder"), row.names = 79:91, class = "data.frame")
这是捕获。如果ID具有多于一条线/导管则无关紧要。我只需要为每个ID获取最早的开始日期,每个ID的最新结束日期,并计算每个ID连接线/导管的连续天数。
某些情况会使问题混淆,例如: ID 491858.此人在2013-05-03删除了一行(dateOrder = 5),并在2013-05-24重新插入了3天。
我打算如何处理这个问题是从最小(开始日期)到最长(结束日期)之间的连续时间天数中减去间隙(天数)。
数据集中有超过20,000条记录。
这是我到目前为止所做的:
根据ID将DF转换为DF列表。 我打算对每个DF应用一个函数,如下所示:
如果每行的后续开始日期和上一个结束日期之间的时间差(天)超过0,则向每个数据框添加TRUE或某个任意列值。
function(y){
for (i in length(y)){
if(difftime(y$Start[i+1], y$End[i], units='days') > 0){
y$test <- TRUE}
}
}
非常感谢任何帮助。
感谢。
更新
忽略days列。没用。我打算从独特的案例中汇总月份行数。
答案 0 :(得分:1)
我想这样的事情可能有所帮助,除非我误解了一些事情:
unlist(lapply(split(DF, DF$ID),
function(x) { totaldays <- max(x$End) - min(x$Start);
x$Start <- c(x$Start[-1], NA);
res <- difftime(x$Start[-length(x$Start)], x$End[-length(x$Start)], units = "days");
res <- res[res > 0];
res <- ifelse(length(res) == 0, 0, res);
return(as.numeric(totaldays - res)) }))
#487622 487639 489027 491858
# 10 17 22 36
DF
是您的dput
。
答案 1 :(得分:0)
如果我理解正确,您需要导管存在的总天数。为此,我会使用plyr
#assume df is your dput object
library(plyr)
day.summary <- ddply(df, "ID", function(x) data.frame(total.days = sum(as.numeric(x$Days))))
print(day.summary)
ID total.days
1 487622 10.14028
2 487639 17.61389
3 489027 27.68542
4 491858 56.08194