将数据从R导出到Excel

时间:2013-10-16 21:45:54

标签: r excel r-faq

我正在编写代码将数据库从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)

enter image description here

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

有人遇到过这种问题吗?

5 个答案:

答案 0 :(得分:27)

最近使用的xlsx包,效果很好。

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

其中x是data.frame

答案 1 :(得分:25)

另一个选项是openxlsx - 包。它不依赖于,可以读取,编辑和编写 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 文件中创建格式化表格。

答案 2 :(得分:12)

writexl,没有Java要求:

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

答案 3 :(得分:11)

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

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

答案 4 :(得分:-1)

这是通过不同的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放入不同的标签中。重要的是在编写append = True文件时设置.xlsx


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'))