R 当数据为长格式时计算速率

R 当数据为长格式时计算速率,r,if-statement,dplyr,grouping,R,If Statement,Dplyr,Grouping,我的数据样本可用 我试图计算每只松鼠的生长率(随着时间的推移体重的变化(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

我的数据样本可用

我试图计算每只
松鼠的生长率(随着时间的推移体重的变化(
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))
我不能使用上面使用的
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循环
可能是实现这一点的方法,但我并不精通这种编码。欢迎提出任何建议或想法

您可以使用
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)))))

这就留下了
NaN
s,其中
age
项为零,但是如果您想使用
df$g.rate[is.NaN(df$g.rate)]您可以使用
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)))))

这就留下了
NaN
s,其中
age
项为零,但是如果您想使用
df$g.rate[is.NaN(df$g.rate)]替代方法,您可以使用data.table及其上一行的函数“shift”将其更改为
NA
s

library(data.table)
df= data.table(df)

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

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

library(data.table)
df= data.table(df)

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

这正是我需要的。谢谢你的帮助!这正是我需要的。谢谢你的帮助!