Есть ли функция для генерации последовательности дней с первой даты, записанной в r? - PullRequest
1 голос
/ 23 апреля 2020

Я пытаюсь проанализировать вероятность выживания растения. Итак, каждые 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 = идентификатор каждого растения. Дата = дата выборки. Я пробовал много разных комбинаций, используя пакет lubridate в R, но я не смог этого сделать. Я хотел бы получить такой фрейм данных:

   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

Есть предложения? Я буду признателен за вашу помощь, спасибо.

Ответы [ 3 ]

2 голосов
/ 23 апреля 2020

Вам нужно использовать пакет 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
1 голос
/ 23 апреля 2020

Использование 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
1 голос
/ 23 апреля 2020

Как только вы измените дату на фактический класс даты.

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
...