在进入研究之前计算跑步平均值

时间:2014-12-01 13:30:37

标签: r

此问题与我最近发布的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

1 个答案:

答案 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