【问题标题】:Renaming multiple columns in different data frames combined into one object重命名不同数据框中的多列组合成一个对象
【发布时间】:2021-01-19 16:01:34
【问题描述】:

我有 65 个 excel 文件存储在一个文件夹中(即 JanuaryFiles)。我需要:

  1. 导入每个 excel 文件,2) 用特定名称重命名列(所有 65 个文件应具有相同的列名),3) 使用任何函数(例如 rbind())将 65 个文件合并到一个文件中,以及4) 用今天的日期命名。

我用过:

mydir = setwd("~/Dropbox/JanuaryFiles")
myfiles = list.files(path=mydir, pattern="*.xlsx", full.names=TRUE)
myfiles

# Here: I need to rename the columns of each excel file:
# Then I used the following to combine the files:

combined.df <- do.call(cbind , dat_All) 

# I'm also still missing the function that names the final file with specific name and today's date.

【问题讨论】:

    标签: r xlsx


    【解决方案1】:

    lapply 函数会将所有数据帧读入名为dfs 的列表对象中。 col_names 参数是您提供列名称的​​地方。 skip 是忽略第一行,它有错误的标题名称(如果你想包含你的 excel 文件的第一行,请删除它)。

    dplyr::bind_rows 会将数据帧列表堆叠到一个 tibble 对象中。

    sprintf("%s.xlsx", Sys.Date()) 使用今天的日期创建文件名。您可以使用format 函数(例如format(Sys.Date(), "%m-%d-%Y")修改输出格式。然后xlsx::write.xlsx 输出数据帧。注意:它必须是数据框而不是 tibble 对象,这就是我使用 as.data.frame 的原因。

    library(dplyr)
    library(xlsx)
    library(readxl)
    
    # Provide a character vector of column names you want to col_names
    dfs <- lapply(myfiles, readxl::read_excel, col_names = cols, skip = 1)
    df <- dplyr::bind_rows(dfs)
    
    xlsx::write.xlsx(as.data.frame(df), sprintf("%s.xlsx", Sys.Date())) 
    

    【讨论】:

    • 谢谢。不幸的是,它没有用。它显示此错误:错误:col_names 必须是逻辑或字符向量 操作无法完成。找不到 Java 运行时。有关安装 Java 的信息,请访问 java.com。操作无法完成。找不到 Java 运行时。有关安装 Java 的信息,请访问java.com
    • cols 是一个虚构的对象,用于说明目的。提供您想要的列名的字符向量以使其工作。例如,cols &lt;- c("Column1", "Column2")
    • 成功了,谢谢。我仍然缺少的唯一部分是导出包含所有 65 个文件的最终文件。 R 显示此消息:``` xlsx::write_excel(as.data.frame(df), sprintf("%s.xlsx", date())) ``` 操作无法完成。找不到 Java 运行时。有关安装 Java 的信息,请访问 java.com。错误:'rJava' 的 loadNamespace() 中的 .onLoad 失败,详细信息:调用:fun(libname, pkgname) 错误:找不到 JVM 另外:警告消息:1:在系统中(“/usr/libexec/java_home” , 实习生 = TRUE) : 运行命令 '/usr/
    • 抱歉,我输入了错误的函数名。它应该是write.xlsx 而不是write_excel。我已经更新了帖子,它现在应该可以运行了。
    • 感谢您的回复,将功能和软件包更改为openxlsx后它就可以工作了。非常感谢您的帮助,再次感谢。
    【解决方案2】:

    您可以在sapply 循环中使用openxlsx::read.xlsx 打开文件,并使用setNames 设置列名。

    col.names <- paste0("V", 1:4)  ## new column names
    file.names <- sapply(1:3, function(i) paste0("file", i, ".xlsx"))  ## your file names
    library(openxlsx)
    r <- do.call(rbind, lapply(file.names, function(x) setNames(read.xlsx(x), col.names)))
    r
    #   V1 V2 V3 V4
    # 1  1  4  7 10
    # 2  2  5  8 11
    # 3  3  6  9 12
    # 4  1  4  7 10
    # 5  2  5  8 11
    # 6  3  6  9 12
    # 7  1  4  7 10
    # 8  2  5  8 11
    # 9  3  6  9 12
    

    数据:

    dat <- data.frame(matrix(1:12, 3, 4))
    sapply(1:3, function(i) openxlsx::write.xlsx(dat, paste0("file", i, ".xlsx")))
    

    【讨论】:

    • 非常感谢,杰。
    猜你喜欢
    • 2020-12-24
    • 2019-11-20
    • 2018-10-27
    • 2018-02-07
    • 2015-02-16
    • 1970-01-01
    • 1970-01-01
    • 2016-04-23
    相关资源
    最近更新 更多