gpt4 book ai didi

r - 基于条件语句使用 mutate() 计算有序观测值

转载 作者:行者123 更新时间:2023-12-02 20:46:15 25 4
gpt4 key购买 nike

我正在尝试计算按另一个变量分组后特定行之间的增长率(类似于 other users )。

这是我的数据示例:

squirrel_id    wt   age    trialdate 
22639 9.7 0 2017-04-20
22639 45.9 24 2017-05-14
22639 130 53 2017-06-12 #caught 3x, 1 trial
22640 10.3 0 2017-04-20
22640 49.2 24 2017-05-14
22640 121 52 2017-06-11
22640 196 84 2017-07-13 #caught 4x, 2 trials
23943 12.9 1 2018-04-27
23943 57.2 26 2018-05-23 #caught 2x, 1 trial
23760 150 73 2018-06-18
23760 165 84 2018-06-29 #caught 2x, 2 trials

为了以这种形式获取此数据,我确保首先使用 library(dplyr) 包来 arrange_by(squirrel_id)

我想做的是计算以下之间的增长率:

  1. 上次观察值和倒数第二个观察值除以已过去的时间 (last_wt-second_last_wt/last_age-second_last_age):[使用 squirrel_id 22640: (196-121)/(84-52)] 以及然后添加一个名为“试用”的列,其中显示“2”
  2. 倒数第二个观察值和倒数第三个观察值除以已过去的时间 (second_last_wt-third_last_wt/second_last_age-third_last_age):[使用 squirrel_id 22640:(121-49.2)/(52-24)]然后添加一个名为“试用”的列,其中显示“1”

但有一个问题:

  • 如果 squirrel_id 总共出现 3 次或更少(例如 squirrel_id 22639 和 23943),那么他们通常仅进行了 1 次试验,因此计算了 1 次增长率。

  • 但是,如果其中 2 个观察值的年龄 > 40 天(例如 squirrel_id 23760),那么他们进行了 2 次试验。

  • 我的希望是拥有一个如下所示的最终数据集:

    squirrel_id    wt   age    trialdate    g.rate     trial
    22639 9.7 0 2017-04-20 NA NA
    22639 45.9 24 2017-05-14 NA NA
    22639 130 53 2017-06-12 3.0 1 #caught 3x, 1 trial
    22640 10.3 0 2017-04-20 NA NA
    22640 49.2 24 2017-05-14 NA NA
    22640 121 52 2017-06-11 2.6 1
    22640 196 84 2017-07-13 2.3 2 #caught 4x, 2 trials
    23943 12.9 1 2018-04-27 NA NA
    23943 57.2 26 2018-05-23 1.7 1 #caught 2x, 1 trial
    23760 150 73 2018-06-18 NA 1
    23760 165 84 2018-06-29 1.4 2 #caught 2x, 2 trials

    如果可能的话,我更喜欢 dplyr() 解决方案。

    最佳答案

    这是一种使用 dplyr 的方法,假设您的数据是 df,如上所述...

    library(dplyr)
    df %>%
    arrange(squirrel_id, age) %>% #sort by id and age
    group_by(squirrel_id) %>% #group by id
    mutate(g.rate = c(NA, diff(wt) / diff(age)), #calculate g.rate
    trial = row_number() - n() + 2 #counting up to 2 at end
    - (n() <= 3) #-1 if 3 or fewer in group
    + (n() <= 3 & sort(-age)[2] <= -40), #+1 if also both age>40
    trial = ifelse(trial<1, NA, trial), #set to NA if less than 1
    g.rate = ifelse(is.na(trial), NA, g.rate)) #set to NA if trial is NA

    squirrel_id wt age trialdate g.rate trial
    1 22639 9.7 0 2017-04-20 NA NA
    2 22639 45.9 24 2017-05-14 NA NA
    3 22639 130 53 2017-06-12 2.9 1
    4 22640 10.3 0 2017-04-20 NA NA
    5 22640 49.2 24 2017-05-14 NA NA
    6 22640 121 52 2017-06-11 2.56 1
    7 22640 196 84 2017-07-13 2.34 2
    8 23760 150 73 2018-06-18 NA 1
    9 23760 165 84 2018-06-29 1.36 2
    10 23943 12.9 1 2018-04-27 NA NA
    11 23943 57.2 26 2018-05-23 1.77 1

    请注意,最后两个 ID 的顺序与您的数据的顺序不同。您可以通过在第一步中执行 arrange(age) 来避免这种情况。

    关于r - 基于条件语句使用 mutate() 计算有序观测值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56343929/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com