首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >R:有选择地将几个csv文件中的数据导入单个数据帧,同时也将数据从行更改为单个列。

R:有选择地将几个csv文件中的数据导入单个数据帧,同时也将数据从行更改为单个列。
EN

Stack Overflow用户
提问于 2015-12-18 02:50:29
回答 3查看 2K关注 0票数 1

我想在R中做下面的事情。

我有类似于下面示例的色谱数据的250+ csv文件,但是有21行而不是3行:

代码语言:javascript
复制
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个文件中的一个子集读取到一个数据框架中,这很容易--但我也需要对其进行合理的重构。

上表中的每一行都是一个峰值。我只需要来自第一列和第四列的数据(分别是“峰值数”和“峰值下的区域”),在输出中,我需要使每个峰值成为单独的列,而不是像上面这样的一行,以峰值号作为标题。最后,我希望创建一个新列,其中每一行(即来自每个csv文件的数据)都被赋予与csv文件名相同的名称。

因此,假设我有3个文件: ABC1.csv、ABC2.csv和ABC3.csv。每个文件都与上面的示例类似。我想自动获取所有这些文件,并将它们合并到一个单一的数据框架中,如下面的一个。

代码语言:javascript
复制
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

我希望我已经说得够清楚了。我已经能够管理大部分步骤,但没有成功地将它们编写成一个脚本。如果有任何方法,我也不知道如何将文件名变成变量。

干杯

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-12-18 04:49:45

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

代码语言:javascript
复制
filenames <- list.files()

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

代码语言:javascript
复制
readdata <- function(filename) {
  df <- read.csv(filename)
  vec <- df[, 4]
  names(vec) <- df[, 1]
  return(vec)
}

循环遍历所有文件并对它们进行rbind

代码语言:javascript
复制
result <- do.call(rbind, lapply(filenames, readdata))

按你喜欢的名字命名

代码语言:javascript
复制
row.names(result) <- filenames
票数 2
EN

Stack Overflow用户

发布于 2015-12-18 04:44:19

下面的代码可能会有所帮助,尽管文件名仍然不能正常工作-

代码语言:javascript
复制
    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)
    }

请注意,这并不是非常漂亮的代码--只是为了完成任务而进行了一些黑客攻击(从分散在各处的多个打印行中可以看到)。

票数 0
EN

Stack Overflow用户

发布于 2015-12-18 04:47:53

这是你的解决办法。只有当我们可以假设每个文件中正好有21个峰值,并且它们是按1:21顺序排列时,这才能起作用。如果不是这样的话,对代码的一些修改应该可以弥补这一点。

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34347823

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档