Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否有函数生成自r中记录的第一个日期起的天数序列?_R_Dataframe_Date_Dplyr_Lubridate - Fatal编程技术网

是否有函数生成自r中记录的第一个日期起的天数序列?

是否有函数生成自r中记录的第一个日期起的天数序列?,r,dataframe,date,dplyr,lubridate,R,Dataframe,Date,Dplyr,Lubridate,我试图分析植物的生存概率。因此,我每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

我试图分析植物的生存概率。因此,我每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
其中:生存是一个二项式向量: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
有什么建议吗?
我将感谢您的帮助,谢谢。

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

df$date <- as.Date(df$date, "%d/%m/%Y")
或者在data.table中


将日期更改为实际日期类后

df$date <- as.Date(df$date, "%d/%m/%Y")
或者在data.table中


您需要使用包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])


您需要使用包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])


使用dplyr和润滑油

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

使用dplyr和润滑油

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

谢谢,这个函数似乎没有正确计算天数。例如,在我的数据中,函数没有将不同日期的新工厂识别为新记录或从0开始。但是它很有用,我将探索这个包。再次感谢。谢谢,函数似乎没有正确计算天数。例如,在我的数据中,函数没有将不同日期的新工厂识别为新记录或从0开始。但是它很有用,我将探索这个包。再次感谢。我的荣幸!!!。但是,您应该将@RonakShah answer标记为已接受,因为他为您提供了直接使用base R的选项。包越小,依赖性就越小,但某些标准除外;你是对的,软件包很有用,但有时我很难记住R中太多的命令和函数。所以,我用软件包中的函数创建函数。哈哈。这是一个实践问题。我很高兴!!!。但是,您应该将@RonakShah answer标记为已接受,因为他为您提供了直接使用base R的选项。包越小,依赖性就越小,但某些标准除外;你是对的,软件包很有用,但有时我很难记住R中太多的命令和函数。所以,我用软件包中的函数创建了函数。哈哈。这是一个实践问题。谢谢!你和Neel为我的问题提供了最好的解决方案。谢谢!你和尼尔为我的问题提供了最好的解决方案。