我想分析一种植物的存活概率。所以,我每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。Date=取样日期.我在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")
你可以做到这一点,在基地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
你需要使用包 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
使用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