R语言提取一个文件夹下所有CSV文件中几个特定列,但是个别CSV文件不存在某个列,如何以NA代替该不存在列?

想写一个循环提取1194个病例的十几个我需要的生化数据。大致分为三步:读取数据,提取数据,合并数据。代码如下:

setwd("D:/备份/试行")
a=list.files("D:/备份/试行")
dir=paste("./试行/",a,sep = "")
n=length(dir)
data1=read.csv(a[1],header=TRUE,stringsAsFactors = FALSE)
combine_data<-data.frame(data1['patname'],data1['patsex'],data1['patage'],data1['ndate'],data1['TBIL'],data1['DBIL'],data1['ALT'],data1['AST'],data1['CHE2'],data1['ALP'],data1['GGT'],data1['TP'],data1['ALB'],data1['HGB'],data1['PLT'],data1['WBC'],data1['AFP'],data1['UREA'],data1['CR'],data1['GLU'],data1['CPCO2'])

for (t in 2:n){
  data=a[t]
inturn.data<-data.frame(data['patname'],data['patsex'],data['patage'],data['ndate'],data['TBIL'],data['DBIL'],data['ALT'],data['AST'],data['CHE2'],data['ALP'],data['GGT'],data['TP'],data['ALB'],data['HGB'],data['PLT'],data['WBC'],data['AFP'],data['UREA'],data['CR'],data['GLU'],data['CPCO2'])
combine_table=rbind(combine_table,inturn.data)

最后报错选择了未指定的列,或变量的列数不对。
我找到了是个别病例的生化数据缺失,可能导致列数改变,但不知该怎么解决,如有想法望告知,感谢🙏!

  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7727379
  • 除此之外, 这篇博客: 如何剪裁csv文件,并从中求出每一列的最大值和平均值,并将最大值和平均值添加到表的末尾中的 如何剪裁csv文件,并从中求出每一列的最大值和平均值,并将最大值和平均值添加到表的末尾 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:

  • 很少用python,第一次用python来处理csv文件,算是一个从无到有的过程吧,文中诸多地方可能有错,感谢指正!

  • 以下回答由chatgpt基于相关博客总结生成:

    我可以提供一个解决方案,可以分成以下几步:

    1. 设置工作目录和读取文件夹中的CSV文件列表
    setwd("文件夹路径")
    file_list <- list.files(pattern = ".csv")
    
    1. 创建一个空数据框
    merged_data <- data.frame()
    
    1. 循环读取文件夹中每个CSV文件,提取特定列,并且处理缺失值
    for (i in 1:length(file_list)){
      # 读取CSV文件
      data <- read.csv(file_list[i], stringsAsFactors = FALSE)
      # 提取特定列列名为例
      data <- data[, c("列名")]
      # 处理缺失值
      data[is.na(data)] <- "NA"
      # 将处理后的数据合并到空数据框中
      merged_data <- rbind(merged_data, data)
    }
    
    1. 手动处理缺失的列
    # 获取最大列数
    max_col <- max(sapply(merged_data, length))
    # 循环遍历每列,如果列数小于最大列数,则填充缺失值
    for (i in 1:max_col){
      merged_data[, i][is.na(merged_data[, i])] <- "NA"
    }
    
    1. 计算缺失值占比和合并数据
    # 计算缺失值占比
    missing_rate <- apply(merged_data, 2, function(x) mean(x == "NA"))
    # 合并数据,如果有重复行,则去重
    final_data <- unique(merged_data)
    

    所以,整个解决方案的代码如下:

    setwd("文件夹路径")
    file_list <- list.files(pattern = ".csv")
    merged_data <- data.frame()
    
    for (i in 1:length(file_list)){
      data <- read.csv(file_list[i], stringsAsFactors = FALSE)
      data <- data[, c("列名")]
      data[is.na(data)] <- "NA"
      merged_data <- rbind(merged_data, data)
    }
    
    max_col <- max(sapply(merged_data, length))
    for (i in 1:max_col){
      merged_data[, i][is.na(merged_data[, i])] <- "NA"
    }
    missing_rate <- apply(merged_data, 2, function(x) mean(x == "NA"))
    final_data <- unique(merged_data)
    

    希望这个解决方案对你有帮助!

先确保你读入dir里面的文件都是表格文件,读入的时候可以保留空值,然后把空值NA转换成字符串“NA”,我也写过,不过我的是读xlsx,处理生存数据,可以参考下

empty_values <- is.na(all$Stage)
all$Stage[empty_values] <- "NA"