【问题标题】:Calculate animal age from capture date and weight根据捕获日期和体重计算动物年龄
【发布时间】:2021-02-28 07:48:51
【问题描述】:

我希望有人能够帮助我计算我数据集中每只动物的年龄(以天为单位)?

我的数据如下所示,描述了通过时间捕获和测量的个体动物。 example$frab.num 是提供唯一动物标识符的因子变量,example$date 是描述捕获动物日期的日期变量(“日期”类),example$wt 是捕获时动物的重量,单位为克.

我的数据框总共包含超过 3800 只在 1996 年至 2020 年间捕获的个体动物。有些动物一生中被捕获多达 30 次,但平均而言,动物只能活 1-3 年,并且可能只被捕获一生中 3 到 4 次。

> example
   frab.num       date   wt
1       001 1996-10-22 1600
2       002 1996-10-22 1450
3       003 1996-10-22 1800
4       004 1996-10-22 1450
5       005 1996-10-22 1700
6       006 1996-10-22 1750
7       007 1996-10-22 1800
8       008 1996-10-22 1350
9       009 1996-10-22 1750
10      010 1996-10-22 1100
11      011 1996-10-22 1000
12      012 1996-10-22 1400
13      013 1996-10-22 1750
14      014 1996-10-22 1400
15      015 1996-10-22 1200
16      016 1996-10-22  700
17      017 1996-10-22 1000
18      018 1996-10-22  450
19      019 1996-10-22  300
20      020 1996-10-22 1100

如果一只动物在 1500 克体重之前首次被捕获,那么我们可以以天为单位计算它们的年龄,因为我们知道它们平均每天长约 10 克。这将获得每只动物首次捕获的年龄。然后,我们可以通过添加第一个捕获日期的年龄以及第一个捕获日期和后续捕获日期之间的天数时间差来计算每个动物在后续捕获日期的年龄。我们无法计算首次捕获时大于 1500 克的动物的年龄。

编辑:可以访问大型示例数据集here

编辑 2: 输出的示例如下所示。请注意,这只是一个小示例,因此不包括重新捕获。年龄中的 NA 值表示动物在首次捕获时大于 1500 克的情况,因此无法计算年龄。

> example
   frab.num       date   wt age
1       001 1996-10-22 1600 NA
2       002 1996-10-22 1450 145
3       003 1996-10-22 1800 NA
4       004 1996-10-22 1450 145
5       005 1996-10-22 1700 NA
6       006 1996-10-22 1750 NA
7       007 1996-10-22 1800 NA
8       008 1996-10-22 1350 135
9       009 1996-10-22 1750 NA
10      010 1996-10-22 1100 110
11      011 1996-10-22 1000 100
12      012 1996-10-22 1400 140
13      013 1996-10-22 1750 NA
14      014 1996-10-22 1400 140
15      015 1996-10-22 1200 120
16      016 1996-10-22  700  70
17      017 1996-10-22 1000 100
18      018 1996-10-22  450  45
19      019 1996-10-22  300  30
20      020 1996-10-22 1100 110

提前谢谢你

【问题讨论】:

  • 如果我们计算捕获时的年龄,我们还需要生日。 R 中的年龄计算也已在之前的帖子中得到解答——例如,stackoverflow.com/questions/3611314/calculate-ages-in-r/…
  • 感谢@Ronak Shah 和@LC-datascientist。我做了一些编辑来发布,希望它们有意义。我没有动物的出生日期,但我们知道它们每天长约 10 克,直到达到 1500 克体重。因此,如果我们在 1500 克重量之前捕获它们,我们基本上可以通过 example$date - (example$wt/10) 估计它们的出生日期 - 如果它们在首次捕获时超过 1500 克,那么我们根本无法估计年龄。

标签: r dplyr


【解决方案1】:

试试这个

library(tidyverse)

df <- read.csv("example2.csv")
df$date <- as.Date(df$date, format = "%d-%m-%Y")

df %>% group_by(frab.num) %>%
  mutate(capture_no = row_number()) %>%
  mutate(age = ifelse(capture_no == 1 & wt > 1500, NA, 
                      ifelse(capture_no == 1, wt/10, 
                             first(wt)/10 + 
                        difftime(date, first(date), units = 'days')))) %>%
  ungroup()

# A tibble: 150 x 5
   frab.num date          wt capture_no   age
      <int> <date>     <int>      <int> <dbl>
 1        1 1996-10-22  1600          1    NA
 2        2 1996-10-22  1450          1   145
 3        3 1996-10-22  1800          1    NA
 4        4 1996-10-22  1450          1   145
 5        5 1996-10-22  1700          1    NA
 6        6 1996-10-22  1750          1    NA
 7        7 1996-10-22  1800          1    NA
 8        8 1996-10-22  1350          1   135
 9        9 1996-10-22  1750          1    NA
10       10 1996-10-22  1100          1   110
# ... with 140 more rows

检查 frab.num = 273

df %>% group_by(frab.num) %>%
  mutate(capture_no = row_number()) %>%
  mutate(age = ifelse(capture_no == 1 & wt > 1500, NA, 
                      ifelse(capture_no == 1, wt/10, 
                             first(wt)/10 + 
                        difftime(date, first(date), units = 'days')))) %>%
  ungroup() %>% filter(frab.num == 273)
                    
# A tibble: 3 x 5
  frab.num date          wt capture_no   age
     <int> <date>     <int>      <int> <dbl>
1      273 1997-04-02  1460          1   146
2      273 1997-06-12     0          2   217
3      273 1997-08-15     0          3   281

【讨论】:

  • 谢谢@AnilGoyal!这行得通。我整天都在努力做到这一点:)
【解决方案2】:

我们可以使用dplyrcase_when(如果您想添加多个条件)。

代码

library(dplyr)
example %>% 
  mutate(
    age = case_when(
    wt < 1500 ~ wt/10
    )

输出

   frab.num       date   wt age
1         1 1996-10-22 1600  NA
2         2 1996-10-22 1450 145
3         3 1996-10-22 1800  NA
4         4 1996-10-22 1450 145
5         5 1996-10-22 1700  NA
6         6 1996-10-22 1750  NA
7         7 1996-10-22 1800  NA
8         8 1996-10-22 1350 135
9         9 1996-10-22 1750  NA
10       10 1996-10-22 1100 110
11       11 1996-10-22 1000 100
12       12 1996-10-22 1400 140
13       13 1996-10-22 1750  NA
14       14 1996-10-22 1400 140
15       15 1996-10-22 1200 120
16       16 1996-10-22  700  70
17       17 1996-10-22 1000 100
18       18 1996-10-22  450  45
19       19 1996-10-22  300  30
20       20 1996-10-22 1100 110

【讨论】:

  • 感谢@Russ Thomas。这与我尝试过的类似;它适用于在第一次捕获时计算动物的年龄,但在随后的捕获中不能正确计算动物的年龄。首次捕获动物的年龄,如果它们小于 1500 克,则只需 example$wt/10。随后捕获的动物年龄为example$wt/10(第一次捕获)加上example$date(当前捕获)减去example$date(第一次捕获)。但是,如果动物在第一次捕获时超过 1500 克,我们将无法计算任何捕获时的年龄。
猜你喜欢
  • 2013-10-31
  • 1970-01-01
  • 2019-08-12
  • 1970-01-01
  • 1970-01-01
  • 2014-04-04
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
相关资源
最近更新 更多