26.数据读取技巧


(学习资料参考北京大学李东风老师《R语言教程》)

26 数据读取技巧

26.1 日期数据

设文件 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')

26.1.1 日期计算

R的日期可以用 difftime 计算差值。 为了计算发病时的年龄,包括小数部分,可以这样计算:

d.dates[,'发病年龄(带小数年)'] <- as.numeric(
  difftime(d.dates[["发病日期"]], d.dates[["出生日期"]], units='days')/365.25)
knitr::kable(d.dates, digits=2)

得到如下:
在这里插入图片描述

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

结果如下:
在这里插入图片描述

26.2 缺失值处理

同样是一个csv表格,bp.csv,以GBK编码保存,读取并打印出表格的结果:
在这里插入图片描述
可以看出,其中有缺失值,读入的收缩压被当成了字符型列,无法进行计算。因此把字符型的收缩压转换为数值型:

d.bp[["收缩压数值"]] <- as.numeric(d.bp[["收缩压"]])
knitr::kable(d.bp)

在这里插入图片描述
(这里不知道为什么没有出现NA而是数值???)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值