R:有选择地将数据从多个 csv 文件导入单个数据框,同时还将数据从行更改为单独的列

R: selectively importing data from several csv files into single data frame while also changing data from rows to individual columns

我希望在 R 中执行以下操作。

我有 250 多个色谱数据的 csv 文件,其结构类似于下面的示例,但有 21 行而不是三行:

1  4.708252    BB    9.946890   7.830349  0.01982016   4.684836   4.742056
2  4.970352    BB    1.792341  1.497008   0.01896829   4.945352   5.005390
3  6.393414    BB    6.599891  5.309925   0.01950091   6.368413   6.428723

我想做的是将所有 250 个文件中的数据子集读取到一个数据框中,这很容易 — 但我还需要对其进行一些重组。

上面table中的每一行都是一个峰。我只想要来自第一列和第四列的数据(分别是“峰数”和“峰下面积”),并且在输出中我需要将每个峰作为一个单独的列,而不是像上面那样的一行,峰值编号为header。最后,我想创建一个新列,其中每一行(即来自每个单独的 csv 文件的数据)的名称都与 csv 文件名相同。

所以,假设我有 3 个文件:ABC1.csv、ABC2.csv 和 ABC3.csv。每个文件看起来都像我上面的例子。我想自动获取所有这些文件并将它们合并到一个数据框中,如下图所示。

ID          1         2          3     
ABC1     9.94689   1.792341   6.599891   
ABC2     9.76651   1.932332   6.600022
ABC3     8.99193   2.556471   6.718934

希望我已经说得够清楚了。我已经能够管理大部分步骤,但未能成功将它们写入单个脚本。而且我不知道如何(如果有的话)将文件名变成一个变量。

干杯

以下代码可能会有一些帮助,但文件名仍然无法正常工作 -

    path <- "C:\Users\Vidyut\"
    filenames <- list.files(path = path,pattern = ".csv")

    l <- data.frame(ID=character(),col1=numeric(),col2=numeric(),col3=numeric(),stringsAsFactors=FALSE)
    for (i in filenames) {
      #i = filenames[1]
      full = paste(path,i,sep="")
      m <- read.csv(full, header=F)

      # extract the subset of rows required from each file
      # m <- m[c(),]

      n<- m[,c(1,4)]
      y <- gsub('.csv','',i)
      print("y=")
      print(y)
      d <- list(ID=as.character(y),col1=n[1,2],col2=n[2,2],col3=n[3,2])
      print("d=")
      print(d)
      l <- rbind.data.frame(l,d)
      print("l=")
      print(l)
    }

请注意,这不是非常漂亮的代码 - 只是为了完成工作而组合在一起的代码(从分散在各处的多条打印行可见)。

这里有一个解决方案。这仅在我们可以假设每个文件中恰好有 21 个峰并且它们按顺序 1:21 时才有效。如果不是这种情况,对代码进行一些更改应该可以解决这个问题。

folder = "c:/temp/"
files <- dir(folder)

first_loop <- TRUE
for (file in files) {
  # Read one file, only the first and fourth columns
  temp <- read.csv(file=paste0(folder,file), 
                   header = FALSE, 
                   colClasses = c("integer", "NULL", "NULL", "numeric",     "NULL", "NULL", "NULL", "NULL"))
  # Transpose the data
  temp <- data.frame(t(temp))
  # Remove the peak number
  temp <- temp[2,]

  # Concatenate the dataframes together
  temp$file <- file
  if (first_loop) {
    data <- temp
    first_loop <- FALSE
  } else {
    data <- rbind(data, temp)
  }
}
data

我假设工作目录设置为文件所在的位置。然后你可以得到下面的文件列表。

filenames <- list.files()

有一个辅助函数来读取文件并只保留第 1 列和第 4 列。

readdata <- function(filename) {
  df <- read.csv(filename)
  vec <- df[, 4]
  names(vec) <- df[, 1]
  return(vec)
}

遍历所有文件并rbind它们

result <- do.call(rbind, lapply(filenames, readdata))

随意命名

row.names(result) <- filenames