【问题标题】:Calculating rates when data is in long form当数据为长格式时计算费率
【发布时间】:2018-04-20 16:53:14
【问题描述】:

我的数据样本可在here 获得。

我正在尝试计算每个 squirrel 的增长率(体重 (wt) 随时间的变化)。

当我拥有宽格式数据时:

squirrel    fieldBirthDate  date1       date2       date3   date4   date5   date6   age1    age2    age3    age4    age5    age6    wt1     wt2     wt3 wt4 wt5 wt6 litterid
22922         2017-05-13    2017-05-14  2017-06-07  NA      NA      NA      NA      1       25      NA      NA      NA      NA      12      52.9    NA  NA  NA  NA  7684
22976         2017-05-13    2017-05-16  2017-06-07  NA      NA      NA      NA      3       25      NA      NA      NA      NA      15.5    50.9    NA  NA  NA  NA  7692
22926         2017-05-13    2017-05-16  2017-06-07  NA      NA      NA      NA      0       25      NA      NA      NA      NA      10.1    48      NA  NA  NA  NA  7719

我可以使用以下代码计算增长率:

library(dplyr)

#growth rate between weight 1 and weight 3, divided by age when weight 3 is recorded
growth <- growth %>%
    mutate (g.rate=((wt3-wt1)/age3))

#growth rate between weight 1 and weight 2, divided by age when weight 2 is recorded
merge.growth <- merge.growth %>%
    mutate (g.rate=((wt2-wt1)/age2))

但是,当数据是长格式(我之后运行的分析所需的格式)时:

squirrel    litterid    date    age wt
22922       7684    2017-05-13  0   NA
22922       7684    2017-05-14  1   12
22922       7684    2017-06-07  25  52.9
22976       7692    2017-05-13  1   NA
22976       7692    2017-05-16  3   15.5
22976       7692    2017-06-07  25  50.9
22926       7719    2017-05-14  0   10.1
22926       7719    2017-06-08  25  48

我无法使用上面使用的mutate 函数。我希望创建一个包含增长率的新列,如下所示:

squirrel    litterid    date    age wt      g.rate
22922       7684    2017-05-13  0   NA      NA
22922       7684    2017-05-14  1   12      NA
22922       7684    2017-06-07  25  52.9    1.704
22976       7692    2017-05-13  1   NA      NA
22976       7692    2017-05-16  3   15.5    NA
22976       7692    2017-06-07  25  50.9    1.609
22926       7719    2017-05-14  0   10.1    NA
22926       7719    2017-06-08  25  48      1.516
22758       7736    2017-05-03  0   8.8     NA  
22758       7736    2017-05-28  25  43      1.368
22758       7736    2017-07-05  63  126     1.860
22758       7736    2017-07-23  81  161     1.879
22758       7736    2017-07-26  84  171     1.930

我一直在用 excel 计算增长率(每个wt 和第一次称重之间的增长率),但是我想在 R 中进行计算,因为我有大量的松鼠要处理.我怀疑if else loops 可能是去这里的方式,但我并不精通那种编码。欢迎任何建议或想法!

【问题讨论】:

    标签: r if-statement dplyr grouping


    【解决方案1】:

    您可以使用group_by 为每只松鼠计算此值:

    group_by(df, squirrel) %>% 
        mutate(g.rate = (wt - nth(wt, which.min(is.na(wt)))) / 
                        (age - nth(age, which.min(is.na(wt)))))
    

    留下NaNs,其中age 项为零,但如果您愿意,可以使用df$g.rate[is.nan(df$g.rate)] &lt;- NA 将其更改为NAs。

    【讨论】:

    • 这正是我所需要的。感谢您的帮助!
    【解决方案2】:

    使用 data.table 及其取上一行的函数“shift”的替代方法

    library(data.table)
    df= data.table(df)
    
    df[,"growth":=(wt-shift(wt,1))/age,by=.(squirrel)]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-16
      • 1970-01-01
      相关资源
      最近更新 更多