26.数据读取技巧

R数据处理

  • 26 数据读取技巧
    • 26.1 日期数据
      • 26.1.1 日期计算
      • 26.1.2 计算周岁
    • 26.2 缺失值处理

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

26 数据读取技巧

26.1 日期数据

设文件 dates.csv 中包含如下内容,并设其文件编码为GBK:

原网页教程中先把日期当做字符串读入代码如下,但是我放到R语言中会报错

d.dates <- read_csv('dates.csv', locale=locale(encoding="GBK"))

于是修改了一下,如下:
26.数据读取技巧_第1张图片
然后用 lubridate::ymd() `函数转换为R日期类型:

d.dates[["出生日期ct"]] <- lubridate::ymd(
  d.dates[["出生日期"]])
d.dates[["发病日期ct"]] <- lubridate::ymd(
  d.dates[["发病日期"]])

26.数据读取技巧_第2张图片
也可以用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.数据读取技巧_第3张图片

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.数据读取技巧_第4张图片

26.2 缺失值处理

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

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

26.数据读取技巧_第6张图片
(这里不知道为什么没有出现NA而是数值???)

你可能感兴趣的:(R语言学习笔记)