此问题与我最近发布的here
问题有关我想根据进入研究的确切日期计算前几年1,2,3等的暴露平均值。
第一人称(2002年2月进入研究)的例子,一年平均值是根据2002年(37)和2001年(328)的天数计算的。 2002年的暴露是18,2001年的暴露是19.这给出了1888569的一年暴露,其由公式(37 * 18)/365.25和(328 * 19)/365.25计算。
同一人的两年平均值包括2002年,2001年和2000年的暴露数据,将是:
2002年的贡献(37 * 18)/ 365.25
2001年的贡献:19
2000年的贡献:(328 * 18)/365.25)/ 2,给出18.49384
由于 此链接后会显示虚假数据:https://drive.google.com/file/d/0B_4NdfcEvU7La1ZCd2EtbEdaeGs/view?usp=sharing
答案 0 :(得分:1)
再一次,这是一个想法。会有更好的方法。无论如何,我修改了你上一个问题的上一个答案。这也不是一个优雅的答案。但是,这就是你所追求的。第一步是重新排列数据框。 test
中的ana
具有每个主题(id)录入年份的天数(例如,id为1的37天)以及其他年份的365天。在第二步中,我按主题(id)拆分数据,并删除哪些年份大于入门年份的行。在最后一步,我按照你在问题中描述的那样做了数学。我为每个主题选择了年份行并创建了一个数据框。
library(reshape2)
library(lubridate)
library(stringi)
library(dplyr)
library(tidyr)
### Arrange the data frame.
ana <- mutate(mydf,id = 1:n()) %>%
melt(id.vars = c("id","entry")) %>%
mutate(variable = stri_extract_last(variable, regex = "\\d+"),
entry = as.Date(entry, format = "%d%b%Y"),
entryYear = as.character(format(entry, "%Y")),
check = ifelse(variable == entryYear, "Y", "N"),
test = ifelse(variable == entryYear, yday(entry) - 1, 365)) %>%
arrange(id)
### Get rid of rows which have larger year numbers than the entry year
bob <- lapply(split(ana, ana$id), function(x) {
indx <- which(x$check == "Y")
if(indx < nrow(x)){
x[-c(indx + 1: nrow(x)),]
}else{x}
}
)
### Get one-year and two-year averages
cathy <- lapply(bob, function(x){
x$one <- ((x[nrow(x),4]) * (x[nrow(x),7]) / 365.25) +
((x[nrow(x)-1,4]) * ((x[nrow(x)-1,7]) - (x[nrow(x),7])) / 365.25)
x$two <- (((x[nrow(x),4]) * (x[nrow(x),7]) / 365.25) +
(x[nrow(x)-1,4]) +
((x[nrow(x)-2,4]) * ((x[nrow(x)-2,7]) - (x[nrow(x),7])) / 365.25)) / 2
subset(x, check == "Y")
})
### Create a data frame. unnest is available in the dev version of tidyr.
unnest(cathy)
# id entry variable value entryYear check test one two
#1 1 2002-02-07 2002 18 2002 Y 37 18.885695 18.493840
#2 2 2002-06-06 2002 16 2002 Y 156 16.561259 16.780630
#3 3 2003-04-16 2003 14 2003 Y 105 15.414100 15.707050
#4 4 2003-05-26 2003 16 2003 Y 145 16.591376 17.096851
#5 5 2003-06-11 2003 13 2003 Y 161 13.549624 14.054073
#6 6 2004-02-20 2004 3 2004 Y 50 2.997947 3.430185
#7 7 2004-07-25 2004 2 2004 Y 206 1.998631 2.216975
#8 8 2004-08-19 2004 4 2004 Y 231 3.997262 4.182067
#9 9 2004-12-19 2004 5 2004 Y 353 5.029432 5.481862