设文件 dates.csv 中包含如下内容,并设其文件编码为GBK:
原网页教程中先把日期当做字符串读入代码如下,但是我放到R语言中会报错
d.dates <- read_csv('dates.csv', locale=locale(encoding="GBK"))
于是修改了一下,如下:
然后用 lubridate::ymd()
`函数转换为R日期类型:
d.dates[["出生日期ct"]] <- lubridate::ymd(
d.dates[["出生日期"]])
d.dates[["发病日期ct"]] <- lubridate::ymd(
d.dates[["发病日期"]])
也可以用R本身的 as.POSIXct
函数转换(和上面的效果是一样的)
d.dates[["出生日期ct"]] <- as.POSIXct(
d.dates[["出生日期"]], format='%Y/%m/%d', tz='Etc/GMT+8')
d.dates[["发病日期ct"]] <- as.POSIXct(
d.dates[["发病日期"]], format='%Y/%m/%d', tz='Etc/GMT+8')
R的日期可以用 difftime
计算差值。 为了计算发病时的年龄,包括小数部分,可以这样计算:
d.dates[,'发病年龄(带小数年)'] <- as.numeric(
difftime(d.dates[["发病日期"]], d.dates[["出生日期"]], units='days')/365.25)
knitr::kable(d.dates, digits=2)
如果按照我们通常计算周岁的方法计算年龄, 算法就不仅包括年的差, 还要判断是否到了本年的生日。
用 lubridate
包的功能计算周岁如下:
age.int <- function(birth, now){
age <- year(now) - year(birth)
sele <- (month(now) * 100 + mday(now)
< month(birth) * 100 + mday(birth))
## sele 是那些没有到生日的人
age[sele] <- age[sele] - 1
age
}
用R本身的功能实现周岁计算如下:
age.int <- function(birth, now){
date1 <- as.POSIXlt(birth)
date2 <- as.POSIXlt(now)
age <- date2$year - date1$year
sele <- (date2$mon * 100 + date2$mday
< date1$mon * 100 + date1$mday)
## sele 是那些没有到生日的人
age[sele] <- age[sele] - 1
age
}
下面我们计算发病时的周岁年龄:
d.dates[["发病年龄"]] <- age.int(d.dates[["出生日期"]], d.dates[["发病日期"]])
knitr::kable(d.dates, digits=2)
同样是一个csv表格,bp.csv,以GBK编码保存,读取并打印出表格的结果:
可以看出,其中有缺失值,读入的收缩压被当成了字符型列,无法进行计算。因此把字符型的收缩压转换为数值型:
d.bp[["收缩压数值"]] <- as.numeric(d.bp[["收缩压"]])
knitr::kable(d.bp)