如何使用R组合不同Excel文件的列并用初始文件的名称重命名列?

问题描述 投票:0回答:2

我在一个文件夹中有 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")

使用此代码,生成了一个新文件,但数据不可用。此外,也没有错误代码。

有人可以帮我解决这个问题吗?

非常感谢!

r tidyverse export reshape2 r-xlsx
2个回答
0
投票

我有一个可行的解决方案,但它提供长格式的数据 - 这实际上可能更好。假设您正在一个项目中工作,并且您要在其中查找文件的文件夹名为“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

0
投票

您只需几个步骤即可完成此操作 - 请注意,要将它们并排组合,您需要确保它们都具有相同的行数。因此,(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>
© www.soinside.com 2019 - 2024. All rights reserved.