【问题标题】:Calculate running-average exposure before entry into study在进入研究之前计算平均暴露量
【发布时间】:2015-01-29 12:38:12
【问题描述】:

这个问题和我最近发的here的问题有关

我想根据进入研究的确切日期计算前 1、2、3 年等的平均暴露量。

以第一人(2002 年 2 月进入研究)为例,一年的平均值是根据 2002 年 (37) 和 2001 年 (328) 的天数计算得出的。 2002 年的曝光率为 18,2001 年为 19。这给出了 18.88569 的一年曝光率,这是根据公式 (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

【问题讨论】:

    标签: r


    【解决方案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
    

    【讨论】:

    • 代码对我不起作用。我收到错误消息,上面写着“if (indx
    • @Meso 我忘了添加library(stringi)。我想知道这是否是原因。
    • @jazzuro,再次感谢。该代码适用于示例数据。然而,我的真实数据仍然比“ana”和 bob 生成的列表更长。当我运行与以前相同的错误消息时。
    • @Meso 我明白了。我想澄清一件事。 ana 是一个 data.frame 并且 bob 是一个列表对象。你在哪里卡住?你能用你的真实数据创建ana吗? bob 怎么样?很难看到正在发生的事情,但我也许可以帮助你。让我知道。附:你能把bob中的x[-c(indx + 1, nrow(x)),]改成x[-c(indx + 1: nrow(x)),]看看会发生什么吗?
    • 问题出在 bob 的创建上。安娜被创造出来。更改 bob 中的代码没有帮助(相同的错误消息)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-09
    • 2011-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-09
    相关资源
    最近更新 更多