我在一个文件夹中有 96 个不同的 Excel 文件,它们都包含一列,看起来大约像这样,其中最上面一行是 Excel 文件的名称:
A1.xlsx
Distance
245
534
142
6342
634
4343
2323
1123
666
A2.xlsx
Distance
2453
2452
4434
3456
6754
但是,它希望有一个 .xlsx 文件,其中所有单独的文件都被并排复制到一个新列中,其中包含源文件的名称作为该列的标题。此外,应删除当前标头。所以,它应该看起来像这样:
A1 A2 ... Cn
245 2453 ... ...
534 2452 ...
142 4434 ...
6342 3456 ...
634 6754 ...
4343 ...
2323 ...
1123
666
到目前为止,我的代码如下:
fileList <-file.path(dir(path = ".", pattern = "^[a-zA-Z].+$", full.names = TRUE), "*.xlsx")
load_if_exists <-function(filename, ...) {
tryCatch(
suppressWarnings(read.table(filename, ...)),
error = function(x) tibble(NA)
)
}
fileList <- list.files(".", "*.xlsx", full.names = TRUE)
listData <- lapply(fileList, read.table)
names(listData) <- gsub(".xlsx","",basename(fileList))
bind_rows(listData, .id = "FileName") %>%
group_by(FileName) %>%
mutate(rowNum = row_number()) %>%
dcast(rowNum~FileName, value.var = "V1") %>%
select(-rowNum) %>%
write.xlsx(file="Result.xlsx")
使用此代码,生成了一个新文件,但数据不可用。此外,也没有错误代码。
有人可以帮我解决这个问题吗?
非常感谢!
我有一个可行的解决方案,但它提供长格式的数据 - 这实际上可能更好。假设您正在一个项目中工作,并且您要在其中查找文件的文件夹名为“excelfiles”。
library(tidyverse)
library(lubridate)
library(readxl)
# List data available for processing ----
files <- list.files("excelfiles/", full.names = TRUE,
recursive = TRUE, pattern = "*.xlsx", ignore.case = TRUE)
filesdb <- tibble(filename = files)
head(filesdb)
# extract information about each table from the filenames using the "word" function
filesdb <- filesdb |>
mutate(ID = word(word(basename(filename), 1, 1, sep = "/"), 1, 1, sep = "\\."))
# make a vector (tempfiles) to use in a function below containing the filenames & ID
tempfiles <- filesdb$filename
IDS <- filesdb$ID
tempfiles <- set_names(tempfiles, IDS)
head(tempfiles)
# write a little function to extract data from each table
import_files <- function(file) {
read_xlsx(file, col_names = TRUE, skip = 1)
}
# Extract the data ----
# This next bit will take a while, depending on the number of files.
# If you'd like to try a few first to make certain it's working, test it on a smaller subset;
# e.g., tempfiles[1:5]
tempdf <- map_df(tempfiles, import_files, .id = "IDS")
输出(您可以使用
pivot_wider
将其转换为您想要的格式)
tempdf
# A tibble: 14 × 2
IDS Distance
<chr> <dbl>
1 A1 245
2 A1 534
3 A1 142
4 A1 6342
5 A1 634
6 A1 4343
7 A1 2323
8 A1 1123
9 A1 666
10 A2 2453
11 A2 2452
12 A2 4434
13 A2 3456
14 A2 6754
您只需几个步骤即可完成此操作 - 请注意,要将它们并排组合,您需要确保它们都具有相同的行数。因此,(1) 导入数据,(2) 找到所有导入的 Excel 文件中的最大行数,(3) 将
NA
(或 ""
,如果您愿意)分配给比该数据短的数据框(4) 将它们全部组合起来(这里使用 do.call
):
flpth <- "your_filepath_here"
fileList <- list.files(flpth, ".xlsx", full.names = TRUE)
listData <- lapply(fileList, readxl::read_excel)
maxLength <- max(unlist(lapply(listData, nrow)))
lengthList <- lapply(listData, \(x){
if(nrow(x) < maxLength) x[(nrow(x)+1):maxLength,] <- NA
x})
do.call(cbind, lengthList)
输出:
A1.xlsx A2.xlsx
1 Distance Distance
2 245 2453
3 534 2452
4 142 4434
5 6342 3456
6 634 6754
7 4343 <NA>
8 2323 <NA>
9 1123 <NA>
10 666 <NA>