R语言与统计分析数据-R语言-图表-决策-Linux-PythonR语言作业

22-R做数据整理实例

2020-01-13  本文已影响0人  wonphen

1、文档结构介绍

导出的文档结构很乱,每一个样本的行数和列数都不统一,存在很多缺失值,甚至还有样本导出一部分后又重新再导出一次的情况。


源文档1
源文档2

2、目的

将每一个样本信息按行整理成规范的数据框。

3、思路

将整个文档以文本的方式整理。

4、导入文本整理R包

library(pacman)
p_load(tidyverse,textclean)

5、抽取信息

# 将每个人的信息按空行分块,每一块是每一个样本的所有信息
lines <- readLines("./data_set/2018浓缩报表 - 副本.csv")
line <- lines %>% mgsub(",,,,,",";",trim = T) %>% mgsub(","," ",trim = T) %>% 
  paste(collapse = " ") %>% str_split(";");line

# 创建存储所有样本信息的数据框
dt <- data.frame()

# 在每一个样本数据块中抽取相应的信息,如果缺失就用NA填充
for (var in line) {
  # 按空格切分
  var <- var %>% replace_white() %>% str_split(" ");var
  
  for (nm in var) {
    # 抽取ID
    sn <- nm %>% str_extract(.,"男|女") %>% paste(collapse = "") %>% str_remove_all("[NA]");sn
    id <- ifelse(sn != "",nm[2],NA);id
    
    # 抽取姓名
    name <- nm %>% str_subset("男|女|^180*|^2018*") ;name
    
    # 抽取性别
    gender <- nm %>% str_extract(.,"男|女") %>% paste(collapse = "") %>% str_remove_all("[NA]")
    gender <- ifelse(gender == "",NA,gender);gender
    
    # 抽取年龄
    age.s <- nm %>% str_subset("岁") %>% str_detect("[0-9]")
    age <- ifelse(age.s,nm %>% str_subset("岁") %>% str_match("[0-9]+"),NA);age
    
    # 抽取住院号
    num <- nm %>% str_subset("住院号:") %>% str_replace("住院号:","")
    num <- ifelse(num != "",num,NA);num
    
    # 抽取病床号
    num2 <- nm %>% str_subset("病床号:") %>% str_replace("病床号:","");num2
    num2 <- ifelse(num2 != "",num2,NA)
    
    # 抽取病区
    domain <- nm %>% str_subset("病区");domain
    
    # 抽取标本种类
    cls <- nm %>% str_subset("标本种类") %>% str_replace("标本种类:","");cls
    
    # 送检日期
    date1 <- nm %>% str_subset("送检日期:") %>% str_replace("送检日期:","");date1
    
    # 报告日期
    date2 <- nm %>% str_subset("报告日期:") %>% str_replace("报告日期:","");date2
    
    # 鉴定结果
    smp <- nm %>% paste(collapse = " ")
    s <- smp %>% str_detect("鉴定结果:")
    rst <- nm %>% str_subset("鉴定结果:") %>% str_replace("鉴定结果:","")
    result <- ifelse(s,rst,NA);result
    
    # 抽取样本
    if (!s)  {
      sample <- NA
    } else {
      sm <- smp %>% str_split("鉴定结果:") %>% unlist()
      sample <- sm[2] %>% str_remove(result) %>% str_trim();sample
  }
  df <- data.frame(`编号`=id,`姓名`=name,`性别`=gender,`年龄`=age,`住院号`=num,`病床号`=num2,
                   `病区`=domain,`标本种类`=cls,`送检日期`=date1,`报告日期`=date2,
                   `鉴定结果`=result,`样本`=sample)
  dt <- rbind(df,dt)
}}

6、存在的问题

鉴定结果中有的有三个值,但是也被切分到了样本中,比如β-Lac,这样的情况较少,可后期再处理一遍。

7、写入文件

write.csv(dt,"2018浓缩报表.csv")

8、最终效果

最终效果
上一篇下一篇

猜你喜欢

热点阅读