合并从R行开始的多个Excel文件

合并从R行开始的多个Excel文件,r,excel,merge,R,Excel,Merge,我有多个Excel文件需要合并成一个,但只有某些行。Excel文件如下所示 所有文件的列标题都相同。我还需要在新生成的文件中添加一个新列a,因此我创建了一个单独的Excel文件,其中只包含标题和新列a。我的脚本首先读取此文件(如下)并将其写入工作簿 接下来,我需要读取每个文件,从第9行开始,一个接一个地合并所有数据。所以最终的结果应该是这样的(减去membersite列,我还没有尝试这个逻辑,但我认为它将是样本ID值的一个子字符串) 然而,我目前的结果是 我目前只使用了3个文件,每个文件都有几十

我有多个Excel文件需要合并成一个,但只有某些行。Excel文件如下所示

所有文件的列标题都相同。我还需要在新生成的文件中添加一个新列a,因此我创建了一个单独的Excel文件,其中只包含标题和新列a。我的脚本首先读取此文件(如下)并将其写入工作簿

接下来,我需要读取每个文件,从第9行开始,一个接一个地合并所有数据。所以最终的结果应该是这样的(减去membersite列,我还没有尝试这个逻辑,但我认为它将是样本ID值的一个子字符串)

然而,我目前的结果是

我目前只使用了3个文件,每个文件都有几十行,但最终的目标是合并大约15-30个文件,每个文件有25到200行。所以

1) 我知道我的代码不正确,但不确定如何获得预期的结果。首先,我的循环正在覆盖数据,因为它在写入数据时总是从第2行/第2列开始。然而,我想不出如何重写这个

2) 日期以通用格式返回(“43008”而非“2017年9月30日”)

3) 某些列数据被放置在不同的列下(如核酸浓度具有组织含量日期的值)

任何建议或帮助都将不胜感激

我的代码

library(openxlsx)   # Excel and csv files
library(svDialogs)   # Dialog boxes

setwd("C:/Users/Work/Combined Manifest")

# Create and load Excel file
wb <- createWorkbook()

# Add worksheet
addWorksheet(wb, "Template")

# Read in & write header file
df.headers <- read.xlsx("headers.xlsx", sheet = "Template")

writeData(wb, "Template", df.headers, colNames = TRUE)

# Function to get user path
getPath <- function() { 
  # Ask for path
  path <- dlgInput("Enter path to files: ", Sys.info()["user"])$res
  if (dir.exists(path)) {
    # If path exists, set the path as the working directory
    return(path)
  } else {
    # If not, issue an error and recall the getPath function
    dlg_message("Error: The path you entered is not a valid directory. Please try again.")$res
    getPath()
  }
}

# Call getPath function
folder <- getPath()

setwd(folder)

# Get list of files in directory
pattern.ext <- "\\.xlsx$"
files <- dir(folder, full=TRUE, pattern=pattern.ext)

# Get basenames and remove extension 
files.nms <- basename(files)
files.nms <- gsub(pattern.ext, "", files.nms)

# Set the names
names(files) <- files.nms

# Iterate to read in files and write to new file
for (nm in files.nms) {

  # Read in files 
  df <- read.xlsx((files[nm]), sheet = "Template", startRow = 9, colNames = FALSE)

  # Write data to sheet
  writeData(wb, "Template", df, startCol = 2, startRow = 2, colNames = FALSE)
}

saveWorkbook(wb, "Combined.xlsx", overwrite = TRUE)
library(openxlsx)#Excel和csv文件
库(svDialogs)#对话框
setwd(“C:/Users/Work/Combined Manifest”)
#创建并加载Excel文件

wb首先,您在问题中提供了大量信息,这通常是一件好事,但我想知道您是否可以通过使用更少、更小的文件重新创建问题来使问题更容易解决。你能想出如何合并两个文件,每个文件先包含少量数据吗

关于您提出的第一个挑战:

1) 是,您正在覆盖每个循环中的工作簿。我建议您加载数据并将其附加到data.frame中,然后在加载所有文件后存储最终结果。看看下面的例子。请注意,此示例使用rbind,如果合并大量文件,则效率低下。因此,如果您有许多文件,您可能需要使用不同的结构

# Create and empty data frame
allData <- data.frame()

# Loop and load files
for(nm in files.nms) {

    # Read in files 
    df <- read.xlsx((files[nm]), sheet = "Template", startRow = 9, colNames = FALSE)

    # Append the data
    allData <- rbind(allData, df)

}

# Write data to sheet
writeData(wb, "Template", df, startCol = 2, startRow = 2, colNames = FALSE)
#创建并清空数据框

allData首先,您在问题中提供了大量信息,这通常是一件好事,但我想知道您是否可以通过使用更少、更小的文件重新创建问题来使问题更容易解决。你能想出如何合并两个文件,每个文件先包含少量数据吗

关于您提出的第一个挑战:

1) 是,您正在覆盖每个循环中的工作簿。我建议您加载数据并将其附加到data.frame中,然后在加载所有文件后存储最终结果。看看下面的例子。请注意,此示例使用rbind,如果合并大量文件,则效率低下。因此,如果您有许多文件,您可能需要使用不同的结构

# Create and empty data frame
allData <- data.frame()

# Loop and load files
for(nm in files.nms) {

    # Read in files 
    df <- read.xlsx((files[nm]), sheet = "Template", startRow = 9, colNames = FALSE)

    # Append the data
    allData <- rbind(allData, df)

}

# Write data to sheet
writeData(wb, "Template", df, startCol = 2, startRow = 2, colNames = FALSE)
#创建并清空数据框

所有数据不建议在循环内使用
rbind
。这会导致过度复制。见帕特里克·伯恩。相反,在循环外建立一个数据帧列表和
rbind
。@MatAff,感谢您的回复。我应该澄清一下,我目前只尝试使用其中的3个文件,每个文件都有几十行。我将合并大约15-30个文件,每个文件有25到200行。除了rbind,您建议使用什么函数?@MatAff,使用您的代码返回以下错误:
rbind中的错误(deparse.level,…):参数列数不匹配
。我仔细检查了文件,所有列都很好。可能是因为@MatAff的代码中有
colNames=FALSE
。由于所有Excel文件在结构上都是相同的,请使用标题读入,然后只添加您的“成员站点”列。@Parfait,这样会不会多次将标题读入数据框?建议不要在循环中使用
rbind
。这会导致过度复制。见帕特里克·伯恩。相反,在循环外建立一个数据帧列表和
rbind
。@MatAff,感谢您的回复。我应该澄清一下,我目前只尝试使用其中的3个文件,每个文件都有几十行。我将合并大约15-30个文件,每个文件有25到200行。除了rbind,您建议使用什么函数?@MatAff,使用您的代码返回以下错误:
rbind中的错误(deparse.level,…):参数列数不匹配
。我仔细检查了文件,所有列都很好。可能是因为@MatAff的代码中有
colNames=FALSE
。由于所有Excel文件在结构上都是相同的,请使用标题读入,然后只添加您的“成员站点”列。@Parfait,这难道不会将标题读入数据框多次吗?
# Create and empty data frame
allData <- data.frame()

# Loop and load files
for(nm in files.nms) {

    # Read in files 
    df <- read.xlsx((files[nm]), sheet = "Template", startRow = 9, colNames = FALSE)

    # Append the data
    allData <- rbind(allData, df)

}

# Write data to sheet
writeData(wb, "Template", df, startCol = 2, startRow = 2, colNames = FALSE)
# Create list (reserve memory)
f.List <- vector("list",length(files.nms))

# Loop and load files
for(eNr in 1:length(files.nms)) {

    # Read in files 
    f.List[[eNr]] <- read.xlsx((files.nms[eNr]), sheet = "Template", startRow = 9)

}

# Append the data
allData <- do.call("rbind", f.List)
# Sample data
df1 <- data.frame(x=1:3, y=3:1)
df2 <- data.frame(y=4:6, x=3:1)
df.List <- list(df1,df2)

# Create list
d.List <- vector("list",length(df.List))

# Loop and add data
for(eNr in 1:length(df.List)) {
    d.List[[eNr]] <- df.List[[eNr]] 
}

# Bind all at once
dfAll <- do.call("rbind", d.List)
print(dfAll)