iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >怎么在R语言中利用xlsx包读写Excel数据
  • 919
分享到

怎么在R语言中利用xlsx包读写Excel数据

2023-06-14 10:06:39 919人浏览 独家记忆
摘要

怎么在R语言中利用xlsx包读写excel数据?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。下载安装xlsx(Rstudio会同步下载并安装rJava, xlsxjars两

怎么在R语言中利用xlsx包读写excel数据?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

下载安装xlsx(Rstudio会同步下载并安装rJava, xlsxjars两个包);

> # 下载并安装xlsx包> install.packages("xlsx")> library(xlsx)

【基础】简单读取excel文件数据

假如是csv或txt等文本类的数据文件,利用R内置函数read.csv()与read.table()就可读取(注意编码格式的参数设置)。Excel由于使用范围最广,很多问题不可避免,因此,xlsx包提供了专门读取xlsx的函数read.xlsx和read.xlsx2,为什么有两个呢?请看以下区别:

函数参数
xlsx::read.xlsx()file, sheetIndex, sheetName=NULL, rowIndex=NULL,startRow=NULL,endRow=NULL, colIndex=NULL,as.data.frame=TRUE, header=TRUE, colClasses=NA,keepFORMulas=FALSE, encoding=“unknown”, passWord=NULL, …
xlsx::read.xlsx2()file, sheetIndex, sheetName=NULL, startRow=1,colIndex=NULL, endRow=NULL, as.data.frame=TRUE, header=TRUE,colClasses=“character”, password=NULL, …

其实只是细微的差别,大家自己体会即可。下面给个参考案例:

> # 指定file和sheetIndex(或sheetName),即可定位到相应的工作表> data1 <- read.xlsx("iris.xlsx",sheetIndex = 1)> head(data1)
Sepal.LengthSepal.WidthPetal.LengthPetal.WidthSpecies
5.13.51.40.2setosa
4.93.01.40.2setosa
4.73.21.30.2setosa
4.63.11.50.2setosa
5.03.61.40.2setosa
5.43.91.70.4setosa

【基础】简单写入数据到excel文件

切莫用R内置函数read.csv()与read.table()去生成xlsx文件,会有你意想不到的麻烦,还是采用专业的包来解决问题吧。 xlsx包同样提供了两个写入数据的函数write.xlsx()和write.xlsx2(),其中细微区别自行参透(注意参数 ...)。

函数参数
xlsx::write.xlsx()x, file, sheetName=“Sheet1”, col.names=TRUE, row.names=TRUE, append=FALSE, showNA=TRUE, password=NULL
xlsx::write.xlsx2()x, file, sheetName=“Sheet1”,col.names=TRUE, row.names=TRUE, append=FALSE, password=NULL, ...

下面是参考案例:

># 指定x待写入数据,file生成的文件名,row.names为false则不生成行名,指定sheet工作表名为Sheet1>write.xlsx(iris, file = "iris.xlsx", row.names = FALSE, sheetName = "Sheet1")

想必会有人在这里踩坑,大家应该注意到有一个append的参数,是否认为将其值设置为TRUE的话,就可以多次向表中写入数据?那就真踩坑了。查看xlsx包中的注释也很模糊:

> # a logical value indicating if x should be appended to an existing file. > # 翻译:一个逻辑值,指示是否应该将x附加到现有文件中

附加到现有文件中,实际上是增加新的sheet,而非在原有sheet工作表中继续增加数据。如需在同一个sheet工作表中多次增加数据,请继续往下看。

【进阶】随心所欲读取excel中的各种信息

说随心所欲 一点不夸张,不仅可以取出excel中的数据,还能识别excel单元格的样式(包括颜色、字体、大小、标注、数据类型等等)。其原理与数据库有点相似,先是定义一个工作簿的对象,再基于工作簿定义里面的工作表,进而逐级查询。下面进行详细介绍:

【样例数据】文件名:iris10.xlsx。

怎么在R语言中利用xlsx包读写Excel数据

声明一个工作簿对象

> # loadWorkbook(file, password=NULL)  #用于声明一个工作簿对象> # 提醒:如果excel文件不在工作空间内,file最好指定为绝对路径> wb <- createWorkbook("iris10.xlsx")

检索工作簿中的sheet

> # sheets <- getSheets(wb)  #用于生成一个list对象,其中包含所有工作表的信息,数据类型为rJava::jobjRef,在此不深入讲解> sheets <- getSheets(wb)

定位目标sheet

> # 本例只有一个sheet,名称为“Sheet1”> sheet <- sheets[["Sheet1"]]  # sheet的数据类型为rJava::jobjRef

读取数据【方法一】

上面read.xlsx()方法能够将整个sheet工作表的数据读取出来,在这里提供另一种方法,不过相对麻烦一点,使用的是xlsx::readColumns()函数

函数参数
xlsx::readColumns()sheet,startColumn,endColumn,startRow,endRow=NULL,as.data.frame=TRUE,header=TRUE, colClasses=NA, …
xlsx::readRows()sheet, startRow, endRow, startColumn, endColumn=NULL

xlsx::readRows()使用起来比较麻烦,不如xlsx::readColumns()好用,有兴趣的可自行研究一下。另外还有两个函数,用于定位表内数据第一行和最后一行的索引(这里与Java的性质一致,从0开始算起)

函数参数
getFirstRowNum()无参。该函数必须基于sheet对象
getLastRowNum()无参。该函数必须基于sheet对象

xlsx::readRows()使用起来比较麻烦,不如xlsx::readColumns()好用,有兴趣的可自行研究一下。另外还有两个函数,用于定位表内数据第一行和最后一行的索引(这里与Java的性质一致,从0开始算起)

函数参数
getFirstRowNum()无参。该函数必须基于sheet对象
getLastRowNum()无参。该函数必须基于sheet对象

下面以xlsx::readColumns()为例获取数据:

> # 该函数必须提供数据的起始列索引值、终止列索引值、起始行索引值、终止行索引值;> dataTmp <- readColumns(sheet, startColumn = 1, endColumn = 10,            startRow = sheet$getFirstRowNum()+1, endRow = sheet$getLastRowNum()+1,            header = T, as.data.frame=TRUE)

as.data.frame=TRUE决定了输出结果为一个数据框。

缺点:在不清楚数据结构的情况下,首行和末行索引值可以求得,但列数一般难以确定,可能导致列缺失或生成多余的列

读取数据【方法二】

另一种方法相对【方法一】要好一点,先是将所有单元格的值获取出来,再生成数据框。(稍微复杂一点)

函数参数注释
xlsx::getRows()sheet, rowIndex=NULL用于获取sheet的每一行数据,返回值list,数据类型为rJava::jobjRef
xlsx::getCells()row, colIndex=NULL, simplify=TRUE用于获取行内每个单元格的数据,返回值list,数据类型为rJava::jobjRef
xlsx::getCellValue()cell, keepFormulas=FALSE, encoding=“unknown”用于获取所有单元格的值,返回值list,数据类型为character,长度为数据表m*n

注意:这里连同标题行也作为单元格数据一并获取,并且如果有null值的单元格,会跳过该单元格

> # 获取cells进而获取values> cells <- sheet %>% getRows() %>% getCells()> values <- lapply(cells,getCellValue)

values获取出来就如下面这个样子,你会发现value的名称向量,每个值都包含了所在单元格的x、y坐标值。

怎么在R语言中利用xlsx包读写Excel数据

> names(values)  #查看values的名称向量 [1] "1.1" "1.2" "1.3" "1.4" "1.5" "2.1" "2.2" "2.3" "2.4" "2.5" "3.1" "3.2" "3.3" "3.4" "3.5" "4.1" [17] "4.2" "4.3" "4.4" "4.5" "5.1" "5.2" "5.3" "5.4" "5.5" "6.1" "6.2" "6.3" "6.4" "6.5" "7.1" "7.2" [33] "7.3" "7.4" "7.5" "8.1" "8.2" "8.3" "8.4" "8.5" "9.1" "9.2" "9.3" "9.4" "9.5" "10.1" "10.2" "10.3"[49] "10.4" "10.5" "11.1" "11.2" "11.3" "11.4" "11.5"

将这些坐标值拆分出来,作为等会重排数据的索引

> addresses <- sapply(names(values),FUN = function(x) str_split(string = x,pattern = "[.]"))

接下来就只需要将其进行重排,形成数据框即可。

> datas.name <- vector(mode = "character")  #声明一个空的向量,用来存放标题> datas <- data.frame()  # 声明一个空的数据框,用来存放目标数据> # 用sapply代替for做循环,避免占用大量内存。同时注意sapply使用时的环境问题,用.GlobalEnv指向最外层环境的变量。> # 这里只对数据进行重排,无需进行计算,所以invisible不显示计算结果> invisible(sapply(addresses,FUN = function(x) {+  if (x[1] == "1") {+   .GlobalEnv$datas.name = c(.GlobalEnv$datas.name,.GlobalEnv$values[[1]])+   .GlobalEnv$values[[1]] <- NULL+  } else {+   .GlobalEnv$datas[x[1],x[2]] <- .GlobalEnv$values[[1]]+   .GlobalEnv$values[[1]] <- NULL+  }+ }))> names(datas) <- datas.name  #最后在添加标题> View(datas)

得到结果与原excel数据一致

怎么在R语言中利用xlsx包读写Excel数据

获取单元格样式与获取数据的方式一致,这里不再增加过多篇幅讲解,只做简单介绍。以下函数按函数名字面理解。

函数参数
xlsx::CellStyle()wb, dataFormat=NULL, alignment=NULL,border=NULL, fill=NULL, font=NULL, cellProtection=NULL
xlsx::setCellStyle()cell, cellStyle
xlsx::getCellStyle()cell
xlsx::createCellComment()cell, string="", author=NULL, visible=TRUE
getCellComment()cell
removeCellComment()cell

其他函数后续如有机会,再做详细介绍吧。

【进阶】随心所欲将数据写入excel文件

我想大家更想看到的就是这部分内容了。确实在日常处理数据时,将数据存储到excel中进行传递是常有的事,谁叫excel是微软亲生的呢。闲话少说,直入正题。

前面基础篇通过write.xlsx()函数将数据写入excel文件中,同时指定sheet名称。但这种写入是一次性的,即一次写入多少就多少。在工作簿里面新增sheet工作表用append控制,但在同个sheet上继续写入数据,会报错:

> write.xlsx(datas,file = "iris10.xlsx",sheetName = "Sheet1",row.names = F,append = T)Error in .jcall(wb, "Lorg/apache/poi/ss/usermodel/Sheet;", "createSheet", :  java.lang.IllegalArgumentException: The workbook already contains a sheet of this name

说是这个名称的sheet已经存在同名的了!

这次我们采用高级一点的方法,跟前面进阶读取数据一样,先是定义一个工作簿的对象,再创建或加载sheet工作表。

函数参数注释
xlsx::createWorkbook()type=“xlsx”用于生成一个新的excel工作簿
xlsx::loadWorkbook()file, password=NULL用于加载当前已存在的excel工作簿
xlsx::saveWorkbook()wb, file, password=NULL使用完必须保存工作簿
xlsx::createSheet()wb, sheetName=“Sheet1”用于生成一个新的sheet工作表
xlsx::removeSheet()wb, sheetName=“Sheet1”用于删除工作表
xlsx::getSheets()wb用于获取当前工作簿里的工作表清单,返回值是list
xlsx::aDDDataFrame()x, sheet, col.names=TRUE, row.names=TRUE,startRow=1,用于获取当前工作簿里的工作表清单,返回值是list
(续上)startColumn=1,colStyle=NULL, colnamesStyle=NULL,rownamesStyle=NULL, showNA=FALSE, characterNA="", byrow=FALSE

前面讲过如何加载已有工作簿,这里以生成新excel工作簿为例,将数据写入文件中

> wb <- xlsx::createWorkbook()> sheets <- getSheet()# 新生成的工作簿没有sheet,系统提示:Workbook has no sheets!> sheet <- createSheet(wb,sheetName = "newSheet1")

此时R内存中已经生成了一个工作簿,包含一个空的sheet工作表,通过addDataFrame()函数将数据写入sheet中.

> # 用上面生成的datas数据框对象,取前4行数据写入当前sheet对象中> addDataFrame(data[1:4,],sheet,row.names = F)> saveWorkbook(wb,file = "iris_new.xlsx")

==记得保存工作簿、记得保存工作簿、记得保存工作簿==

如果是在已有excel工作簿上操作,这里最好做一个判断,避免覆盖现有数据,造成不必要的麻烦。如果当前sheet的最后一行索引不等于零(说明有数据),则将新数据写到最后一行数据的下一行,同时不加入列名行(col.names = FALSE);如果为零则将数据直接添加到sheet中。

> # 用上面生成的datas数据框对象,取前4行数据写入当前sheet对象中> if (sheet$getLastRowNum() != 0) {+     addDataFrame(data[1:4,],sheet,row.names = F,col.names = F,startRow = sheet$getLastRowNum() + 2)+    } else {+     addDataFrame(data[1:4,],sheet,row.names = F)+    }+ }> saveWorkbook(wb,file = "iris_new.xlsx")

关于怎么在R语言中利用xlsx包读写Excel数据问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注编程网精选频道了解更多相关知识。

--结束END--

本文标题: 怎么在R语言中利用xlsx包读写Excel数据

本文链接: https://www.lsjlt.com/news/269922.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么在R语言中利用xlsx包读写Excel数据
    怎么在R语言中利用xlsx包读写Excel数据?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。下载安装xlsx(Rstudio会同步下载并安装rJava, xlsxjars两...
    99+
    2023-06-14
  • R语言之xlsx包读写Excel数据的操作
    感谢Adrian A. Drǎgulescu发布的xlsx包 xlsx包提供了必要的工具来与Excel 2007进行交互。用户可以阅读和编写xlsx,并可以通过设置数据格式、字体、颜...
    99+
    2022-11-12
  • 怎么利用纯C语言对EXCEL进行读写操作
    本文小编为大家详细介绍“怎么利用纯C语言对EXCEL进行读写操作”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么利用纯C语言对EXCEL进行读写操作”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、写操作单纯...
    99+
    2023-07-02
  • R语言中怎么读取前n行数据
    小编给大家分享一下R语言中怎么读取前n行数据,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!什么是R语言R语言是用于统计分析、绘图的语言和操作环境,属于GNU系统的...
    99+
    2023-06-14
  • 怎么在R语言中使用dplyr包对数据进行处理
    这期内容当中小编将会给大家带来有关怎么在R语言中使用dplyr包对数据进行处理,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。数据筛选函数:#可使用filter()函数筛选/查找特定条件的行或者样本#fil...
    99+
    2023-06-08
  • 怎么在R语言中使用筛选数据
    这期内容当中小编将会给大家带来有关怎么在R语言中使用筛选数据,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。什么是R语言R语言是用于统计分析、绘图的语言和操作环境,属于GNU系统的一个自由、免费、源代码开放...
    99+
    2023-06-14
  • 怎么在R语言中导入CSV数据
    这期内容当中小编将会给大家带来有关怎么在R语言中导入CSV数据,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。第一、查看读取路径:getwd()```getwd() #获取文件存储位置[1]&nb...
    99+
    2023-06-13
  • R语言怎么使用cgdsr包获取TCGA数据
    本篇内容主要讲解“R语言怎么使用cgdsr包获取TCGA数据”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“R语言怎么使用cgdsr包获取TCGA数据”吧!TCGA数据源众所周知,TCGA数据库是...
    99+
    2023-07-02
  • 怎么在R语言数据框中使用负索引
    本篇文章给大家分享的是有关怎么在R语言数据框中使用负索引,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。什么是R语言R语言是用于统计分析、绘图的语言和操作环境,属于GNU系统的一...
    99+
    2023-06-14
  • R语言中怎么利用sapply函数提取列表中的数据
    R语言中怎么利用sapply函数提取列表中的数据,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。y<-c("100-D","100-A&quo...
    99+
    2023-06-02
  • 怎么在R语言中使用summary()函数
    本篇文章为大家展示了怎么在R语言中使用summary()函数,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。什么是R语言R语言是用于统计分析、绘图的语言和操作环境,属于GNU系统的一个自由、免费、源代...
    99+
    2023-06-14
  • 怎么在R语言中使用cut()函数
    怎么在R语言中使用cut()函数?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。什么是R语言R语言是用于统计分析、绘图的语言和操作环境,属于GNU系统的一个自由、...
    99+
    2023-06-14
  • 怎么在R语言中使用caret包比较ROC曲线
    这篇文章将为大家详细讲解有关怎么在R语言中使用caret包比较ROC曲线,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。操作加载对应的包与将训练控制算法设置为10折交叉验证,重复次数为3:li...
    99+
    2023-06-14
  • 怎么在R语言中使用数组实例
    怎么在R语言中使用数组实例?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。使用array()函数创建数组。 它使用向量作为输入,并使用dim参数中的值创建数组。例以下示例创建一个...
    99+
    2023-06-14
  • 怎么在R语言中定义数据框的列名
    这篇文章给大家介绍怎么在R语言中定义数据框的列名,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1.在定义数据框时,定义列名:例如:a<-c(2,23,45,6,7,1,6,7)   ...
    99+
    2023-06-14
  • 怎么在R语言中利用data.frame实现分组计数和求和
    今天就跟大家聊聊有关怎么在R语言中利用data.frame实现分组计数和求和,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。方法1:cnt = table(df$s...
    99+
    2023-06-14
  • 怎么在R语言项目中调用seq()函数
    这篇文章给大家介绍怎么在R语言项目中调用seq()函数,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。首先,我们来看一个seq()函数应用的实例!x <- seq(0, 10,&nbs...
    99+
    2023-06-08
  • 怎么在R语言中实现数据预处理操作
    本篇文章给大家分享的是有关怎么在R语言中实现数据预处理操作,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一、项目环境开发工具:RStudioR:3.5.2相关包:infothe...
    99+
    2023-06-08
  • 怎么在R语言中对数据进行重新编码
    怎么在R语言中对数据进行重新编码?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。(一)使用逻辑判断式(1)现假设我们需要将下面的连续型变量x按照10与20分成三个...
    99+
    2023-06-14
  • R语言rhdf5怎么读写hdf5并展示文件组织结构和索引数据
    这篇文章主要介绍“R语言rhdf5怎么读写hdf5并展示文件组织结构和索引数据”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“R语言rhdf5怎么读写hdf5并展示文件组织结构和索引数据”文章能帮助大...
    99+
    2023-07-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作