【问题标题】:Is there a function to generate a sequence of number of days since the first date recorded in r?是否有一个函数可以生成自 r 中记录的第一个日期以来的天数序列?
【发布时间】:2020-08-06 08:35:13
【问题描述】:

我正在尝试分析植物的生存概率。因此,我每 8 天记录每株植物 3 个月的存活/死亡情况。我有一个这样的数据框:

   sampling date       ID    survival
1        1 04/03/2017 L4           0
2        1 04/03/2017 L5           0
3        1 04/03/2017 L6           0
4        2 15/03/2017 L4           0
5        2 15/03/2017 L5           1
6        2 15/03/2017 L6           0
7        3 23/03/2017 L4           0
8        3 23/03/2017 L6           1

其中:Survival 是一个二项式向量:1= 活着,0= 死亡。 ID = 每个植物的 ID。日期 = 采样日期。 我在 R 中使用 lubridate 包尝试了许多不同的组合,但我做不到。我想获得这样的数据框:

   sampling date       ID    survival        days
1        1 04/03/2017 L4           0           0
2        1 04/03/2017 L5           0           0
3        1 04/03/2017 L6           0           0
4        2 15/03/2017 L4           0           11
5        2 15/03/2017 L5           1           11
6        2 15/03/2017 L6           0           11
7        3 23/03/2017 L4           0           19
8        3 23/03/2017 L6           1           19

有什么建议吗? 非常感谢您的帮助,谢谢。

【问题讨论】:

    标签: r dataframe date dplyr lubridate


    【解决方案1】:

    一旦您将日期更改为实际日期类。

    df$date <- as.Date(df$date, "%d/%m/%Y")
    

    您可以在基础 R 中执行此操作:

    df$days <- with(df, as.integer(date - ave(date, ID, FUN = min)))
    

    dplyr

    library(dplyr)
    df %>% group_by(ID) %>% mutate(days = as.integer(date - min(date)))
    

    或在data.table

    library(data.table)
    setDT(df)[, days := as.integer(date - min(date)), ID]
    df
    
    #   sampling       date ID survival days
    #1:        1 2017-03-04 L4        0    0
    #2:        1 2017-03-04 L5        0    0
    #3:        1 2017-03-04 L6        0    0
    #4:        2 2017-03-15 L4        0   11
    #5:        2 2017-03-15 L5        1   11
    #6:        2 2017-03-15 L6        0   11
    #7:        3 2017-03-23 L4        0   19
    #8:        3 2017-03-23 L6        1   19
    

    【讨论】:

    • 谢谢!你和尼尔为我的问题提供了最好的解决方案。
    【解决方案2】:

    使用 dplyr 和 lubridate

    library(dplyr)
    library(lubridate)
    
    d %>% group_by(ID) %>% 
      mutate(days = difftime(time1 = date, time2 = min(date), units = "days"))
    

    输出

    sampling date       ID    survival days   
      <chr>    <date>     <chr>    <dbl> <drtn> 
    1 1        2017-03-04 L4           0  0 days
    2 1        2017-03-04 L5           0  0 days
    3 1        2017-03-04 L6           0  0 days
    4 2        2017-03-15 L4           0 11 days
    5 2        2017-03-15 L5           1 11 days
    6 2        2017-03-15 L6           0 11 days
    7 3        2017-03-23 L4           0 19 days
    8 3        2017-03-23 L6           1 19 days
    

    【讨论】:

    • 我的荣幸!!!。但是,您应该将@RonakShah 答案标记为已接受,因为他为您提供了直接使用基本 R 的选项。较少的包,较少的依赖项,除了一些标准;)
    • 你说得对,包很有用,但有时我很难记住 R 中太多的命令和函数。所以,我用包中的函数创建了函数,哈哈。这是一个实践问题。
    【解决方案3】:

    你需要使用包chron,使用as.Date函数将日期转换为日期对象,然后日期会被减去。

    我使用此代码得到您想要的输出:

    输入:

    ## to create your sample dataset -- so you can see what data types I started with
    sampling <- c(1,1,1,2,2,2,3,3)
    date <- c('04/03/2017','04/03/2017','04/03/2017','15/03/2017','15/03/2017','15/\
    03/2017','23/03/2017','23/03/2017')
    ID <- c('L4','L5','L6','L4','L5','L6','L4','L6')
    survival <- c(0,0,0,0,1,0,0,1)
    
    ##this is the actual part of the code that calculates days since the first
    
    library(chron)
    df <- data.frame(sampling,date,ID,survival)
    df$date <- as.Date(df$date,format='%d/%m/%Y') 
    # convert date to chron fmt -- see
    #    https://www.stat.berkeley.edu/~s133/dates.html
    
    df$days <- as.integer(df$date - df$date[1])
    
    

    输出:

    > df
      sampling       date ID survival days
    1        1 2017-03-04 L4        0    0
    2        1 2017-03-04 L5        0    0
    3        1 2017-03-04 L6        0    0
    4        2 2017-03-15 L4        0   11
    5        2 2017-03-15 L5        1   11
    6        2 2017-03-15 L6        0   11
    7        3 2017-03-23 L4        0   19
    8        3 2017-03-23 L6        1   19
    

    【讨论】:

    • 谢谢,该函数似乎没有正确计算天数。例如,在我的数据中,函数没有将不同日期的新植物识别为新记录,或者从 0 开始。但它很有用,我将探索这个包。再次感谢。
    猜你喜欢
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-26
    • 2020-06-03
    • 2017-05-14
    • 2021-09-11
    • 2021-07-28
    相关资源
    最近更新 更多