在使用R package:readxl并写入csv

时间:2016-09-22 02:35:51

标签: r excel csv xlsx readxl

我对R和编程很新,需要帮助排列~2000 .xls和.xlsx文件中包含的数据。每个文件的开头都是34到40行"垃圾"标题前的文字;标题下的所有数据都具有相同的尺寸。

我试过的第一种方法是将数据添加到列表中;垂直格式没用。

library(readxl)
file.list <- list.files(pattern='*.xls')
dm.list <- lapply(file.list, read_excel)

我目前正在尝试一次读取一个文件,删除&#34;垃圾&#34;文本,并写入.csv文件(逐列附加数据)。

library(readxl)
file.list <- list.files(pattern='*.xls')

for(i in 1:dim.data.frame(file.list))

store.matrix <-  read_excel((paste0("C:\\Users\\jlmine\\Desktop\\qPCRextData\\", file.list[i])), sheet = "Results")

while (store.matrix[1,1] != "Well") #search for header
{  store.matrix <- store.matrix[-c(1)] } #delete non-header rows

write.csv(store.matrix, file = "qPCRdataanalysis.csv", append = TRUE)

以下行引发错误:

store.matrix <- read_excel((paste0("C:\\Users\\jlmine\\Desktop\\qPCRextData\\", file.list[i])), sheet = "Results")
  

错误:&#39; C:\ Users \ jlmine \ Desktop \ qPCRextData \&#39;不存在。在   另外:警告信息:1:dim.data.frame(file.list):
  数值表达式有2个元素:只使用第一个

&#34; C:\用户\ jlmine \桌面\ qPCRextData \&#34;被设置为我的工作目录 任何想法都将不胜感激。

2 个答案:

答案 0 :(得分:0)

无法访问.xlsx文件,问题似乎出现在for循环语句中。 list.files返回指定目录中文件的字符向量。在长度为5的向量x上使用dim.data.frame会得到结果:

#[0, 5]

从您的警告消息中,您只知道for循环中正在使用第一个元素。所以你没有循环任何东西。

因此,如果你想更优雅地遍历所有文件,你就会......

for (i in seq(length(file.list)) {

答案 1 :(得分:0)

我无法在不看到您的某些数据的情况下确定,但看起来您可以在每个文件中阅读,找到&#34; real&#34;数据开始然后删除&#34;垃圾&#34;行。例如:

df.list = lapply(file.list, function(f) {

  # Read file
  tmp = read_excel(f, sheet="Results")

  # Find highest index of row containing "Well" and add 1 (assuming here
  # that a row containing "Well" will come before the header row).
  s = which(apply(tmp, 1, function(x) {grep("Well", x)}) > 0)
  s = ifelse(length(s) > 0, max(s) + 1, 0)

  # Reset column names to the values in row s (the actual header row)
  # Remove rows 1 through s (the "junk" text plus the header row) from the data frame
  if(s > 0) {
    names(tmp) = tmp[s, ]
    tmp[-(1:s), ]
  }

})

您现在拥有df.list,这是一个列表,其中每个元素都是您刚刚加载的xls / xlsx文件之一。您说您希望按列组合数据,但如果每个数据框具有相同的列,则不希望堆叠数据帧。要做到这一点,你可以这样做:

df.list = do.call(rbind, df.list)

您现在拥有一个数据框,您可以将其另存为csv文件。