将数据从 R 导出到 Excel

Posted

技术标签:

【中文标题】将数据从 R 导出到 Excel【英文标题】:Export data from R to Excel 【发布时间】:2013-10-25 05:28:13 【问题描述】:

我正在编写代码以将数据库从 R 导出到 Excel,我一直在尝试其他代码,包括:

write.table(ALBERTA1, "D:/ALBERTA1.txt", sep="\t")
write.csv(ALBERTA1,":\ALBERTA1.csv")
your_filename_in_R = read.csv("ALBERTA1.csv")
your_filename_in_R = read.csv("ALBERTA1.csv")
write.csv(df, file = "ALBERTA1.csv")
your_filename_in_R = read.csv("ALBERTA1.csv")
write.csv(ALBERTA1, "ALBERTA1.csv")
write.table(ALBERTA1, 'clipboard', sep='\t')
write.table(ALBERTA1,"ALBERTA1.txt")
write.table(as.matrix(ALBERTA2),"ALBERTA2.txt")
write.table(as.matrix(vecm.pred$fcst$Alberta_Females[,1]), "vecm.pred$fcst$Alberta_Females[,1].txt")
write.table(as.matrix(foo),"foo.txt")
write.xlsx(ALBERTA2, "/ALBERTA2.xlsx")
write.table(ALBERTA1, "D:/ALBERTA1.txt", sep="\t").

本论坛的其他用户建议我这样做:

write.csv2(ALBERTA1, "ALBERTA1.csv")
write.table(kt, "D:/kt.txt", sep="\t", row.names=FALSE)

您可以在图片上看到我从上面的代码中得到的结果。但是这个数字不能用于进行任何进一步的操作,例如与其他矩阵的加法。

有人遇到过这种问题吗?

【问题讨论】:

如果您不发布dput(ALBERTA1)dput(head(ALBERTA1)) 的输出,我们将无法提供帮助。会有太多的猜测。 请注意,这显然是对this 问题的跟进。 RGUI界面前6位数字分别为:55.5486398、57.8471114、54.5190511、50.5751821、49.4739451、53.4697459。您可以检查每个输出都有一个短小数部分。但是,当我通过上述代码在 Excel 上传输相同的数字列表时,我得到以下不明确的输出形状:555.486.398.454.784、578.471.113.839.479、54.519.051.119.506、49.473.945.115.391、 534.697.459.336.592, 505.751.821.039.884..etc 当然无法管理你可以看到555.486.398.454.784(在excel中)与55.5486398(R-gui界面)完全不同。 【参考方案1】:

另一个选项是openxlsx-package。它不依赖于java,可以读取、编辑和写入Excel 文件。来自包装的描述:

openxlsx 简化了从 R 编写和设置 Excel xlsx 文件样式的过程,并消除了对 Java 的依赖

示例用法:

library(openxlsx)

# read data from an Excel file or Workbook object into a data.frame
df <- read.xlsx('name-of-your-excel-file.xlsx')

# for writing a data.frame or list of data.frames to an xlsx file
write.xlsx(df, 'name-of-your-excel-file.xlsx')

除了这两个基本函数之外,openxlsx-包还有许多其他函数用于处理 Excel-文件。

例如,使用writeDataTable-函数,您可以在Excel-文件中创建格式化表格。

【讨论】:

openxlsx 依赖于 Rtools,需要安装并添加到系统变量路径。不适合公司计算机。我使用它,现在尝试寻找替代方案,因为我需要制作我的代码的可移植版本,无需安装任何东西即可工作。 @Arani 我非常怀疑这一点。我在没有 Rtools 的 Windows VM 上安装了openxlsx,它可以正常工作。 在我的情况下,除了saveWorkbookwrite.xlsx 之外,它什么都做。为此,它要求使用 Rtools。神秘! @jaap 一些功能依赖于 Rtools 但不是全部 @Jaap 是的,请检查此页面github.com/awalker89/openxlsx/issues/111【参考方案2】:

最近用的xlsx包,效果不错。

library(xlsx)
write.xlsx(x, file, sheetName="Sheet1")

其中 x 是一个数据帧

【讨论】:

xlsx 需要 Java。如果出于某种原因它不能被 R 访问(公司计算机上的奇怪设置),那么这将不起作用。 将java的jre路径添加到系统变量Path中,R可以访问Java功能。为此,请转到我的电脑属性,然后是高级系统设置,然后是环境变量。将 java 路径添加到“路径”。【参考方案3】:

writexl,无 Java 要求:

# install.packages("writexl")
library(writexl)
tempfile <- write_xlsx(iris)

【讨论】:

不幸的是,对于企业计算机也不是很好:“仅以源代码形式提供的软件包,可能需要编译 C/C++/Fortran:‘writexl’ 这些将不会被安装” @JulianDrago 你不能在非公司的电脑上编译吗? 不是我的选择,对于许多其他人来说,由 cmets 在这个问题上判断。我的评论旨在提醒我们这些人,这可能不适用于防火墙/非管理员用户工作环境 - 我怀疑我们中的许多人出于这个原因在这里寻找流行的 xlsx 包的替代品,可能工作。【参考方案4】:

WriteXLS 包中的 WriteXLS 函数可以将数据写入 Excel。

或者,xlsx 包中的 write.xlsx 也可以使用。

【讨论】:

xlsx 需要 Java。 WriteXLS 需要 Perl。如果出于某种原因,R 无法访问这些(我不能轻易选择在我的公司计算机上安装什么),那么这些都不起作用。 (我知道开发人员依赖现有的 Java 和 Perl 库很方便;但 R 不应该自立吗??) writeXLS 无法处理字符中的换行符。【参考方案5】:

这是一种将数据帧中的数据通过不同的 ID 写入 excel 文件并通过与第一级 ID 关联的另一个 ID 写入不同的选项卡(工作表)的方法。假设您有一个数据框,其中 email_address 作为一列用于多个不同的用户,但每封电子邮件都有许多包含所有数据的“子 ID”。

data <- tibble(id = c(1,2,3,4,5,6,7,8,9), email_address = c(rep('aaa@aaa.com',3), rep('bbb@bbb.com', 3), rep('ccc@ccc.com', 3)))

因此 ID 1,2,3 将与 aaa@aaa.com 相关联。以下代码通过电子邮件拆分数据,然后将1,2,3 放入不同的选项卡中。重要的是在写.xlsx文件的时候设置append = True


temp_dir <- tempdir()

for(i in unique(data$email_address))
    
  data %>% 
    filter(email_address == i) %>% 
    arrange(id) -> subset_data
  
  for(j in unique(subset_data$id))
    write.xlsx(subset_data %>% filter(id == j), 
      file = str_c(temp_dir,"/your_filename_", str_extract(i, pattern = "\\b[A-Za-z0- 
       9._%+-]+"),'_', Sys.Date(), '.xlsx'), 
      sheetName = as.character(j), 
      append = TRUE)
 
  

正则表达式从电子邮件地址中获取名称并将其放入文件名中。

希望有人觉得这很有用。我确信有更优雅的方法可以做到这一点,但它确实有效。

顺便说一句,这是一种将这些单独的文件发送到data.frame 中的各个电子邮件地址的方法。代码进入第二个循环[j]

  send.mail(from = "sender@sender.com",
            to = i,
          subject = paste("Your report for", str_extract(i, pattern = "\\b[A-Za-z0-9._%+-]+"), 'on', Sys.Date()),
          body = "Your email body",
          authenticate = TRUE,
          smtp = list(host.name = "XXX", port = XXX,
                      user.name = Sys.getenv("XXX"), passwd = Sys.getenv("XXX")),
          attach.files = str_c(temp_dir, "/your_filename_", str_extract(i, pattern = "\\b[A-Za-z0-9._%+-]+"),'_', Sys.Date(), '.xlsx'))


【讨论】:

【参考方案6】:

我一直在尝试不同的包,包括功能:

install.packages ("prettyR") 

library (prettyR)

delimit.table (Corrvar,"Name the csv.csv") ## Corrvar 是我在缩放变量上运行回归的输出中的对象名称。

但是,我为另一个分析的输出(占用模型模型选择输出)尝试了相同的代码,但它不起作用。经过多次尝试和探索,我:

从 R 复制输出 (Ctrl+c) 我在 Excel 表中粘贴了它(Ctrl+V) 选择数据所在的第一列

在“数据”小插图中,单击“文本到列”

选择分隔选项,点击下一步

在“分隔符”中勾选空格,点击下一步

点击完成(结束)

您的输出现在应该是可以在 excel 中轻松操作的形式。因此,这可能不是最理想的选择,但如果您只想以另一种方式探索数据,它就可以解决问题。

PS。如果 excel 中的标签不是确切的标签,那是因为我从我的西班牙语 excel 中翻译了标签。

【讨论】:

以上是关于将数据从 R 导出到 Excel的主要内容,如果未能解决你的问题,请参考以下文章

怎么将几十万数据导出到excel

ROBDC SqlSave:如何将数据导出到 Excel 工作表中?

通过保留数据类型将数据从 JSON 导出到 excel [关闭]

R语言的数据导入和导出

将数据从 Excel 导出到 Access - 错误:参数不是可选的

将特定 Excel 数据从多个字段导出到 Word