基于R语言的统计分析基础:操作XML文件与YAML文件

XML文件简介

在处理从文本文件中读取数据的任务时,用户承担着至关重要的责任,即需要充分理解和明确指定在创建该文件时所遵循的一系列约定和规范。这些约定涵盖了多个方面,包括但不限于:

  1. 注释字符:识别并忽略文件中用于添加说明性文字的特殊字符或符号。
  2. 标题行的存在与否:确定文件的首行是否作为列名或仅作为数据的一部分。
  3. 值分隔符:明确字段之间是如何分隔的,比如逗号、制表符或其他特定字符。
  4. 缺失值的表示方法:规定在数据中如何标识缺失或未提供的值,可能采用特定的字符串(如“N/A”)、空字段或其他占位符。

为了更有效地管理和传达这些复杂的约定,可扩展标记语言(XML)应运而生,它作为一种强大的工具,不仅能够处理标准数据集,还能轻松应对更为复杂的数据结构需求。XML凭借其高度的灵活性和可扩展性,正逐渐成为数据标记与交换的通用标准,广泛应用于各个领域,如地理数据(例如地图信息)、图形显示描述、数学表达式编码等。

XML的一大优势在于它提供了声明文件编码的机制,例如通过以下声明指定使用UTF-8编码:<?xml version="1.0" encoding="UTF-8"?>。尽管这一声明并非强制性要求,但它对于确保数据的正确解析和跨平台兼容性至关重要。

在R语言环境中,处理XML文档的功能主要由XML包提供,该包支持XML文件的读取与写入操作。此外,CRAN上的StatDataML包是一个基于XML构建的实用示例,展示了如何在统计数据处理中应用XML标准。另一个值得注意的API是由xml2包提供的,该包建立在高效的libxml2 C库之上,为用户带来了更快速、更稳定的XML处理能力。

以下为XML文件的基础编写方法

XML文档声明:

XML文档声明位于XML文档的最前面,用于声明这是一个XML文档,并指定XML的版本和编码方式。语法如下:

<?xml version="1.0" encoding="UTF-8"?>
  • version属性:用来表示XML的版本号,目前常用的版本是1.0。
  • encoding属性:指定XML文档的字符编码方式,常用的编码方式有UTF-8和GB2312等。
  • standalone属性(可选):说明文档是否是独立的,yes表示文档没有依赖外部文件,no表示文档依赖于外部文件。

元素(标签/节点):

XML文档由元素(或称为标签、节点)组成,元素用于定义数据的结构。元素由开始标签和结束标签组成,标签名大小写敏感。

  • 开始标签:以<开头,标签名紧跟其后,以>结束。
  • 结束标签:以</开头,后面跟上标签名,以>结束。
  • 自闭合标签:对于没有内容的元素,可以使用自闭合标签,语法为<标签名/>

例如:

<book><title>XML基础教程</title><author>张三</author>
</book>

属性:

元素可以包含属性,属性用于提供关于元素的额外信息。属性必须放在开始标签中,并且多个属性之间用空格分隔。属性值必须用引号(单引号或双引号)括起来。

例如:

<person age="30">阿斌</person>

注释:

XML中的注释用于添加对XML内容的说明,注释内容不会被XML解析器解析。注释以<!--开始,以-->结束。

例如:

<!-- 这是一个注释 -->

CDATA区:

CDATA区用于包含那些不应被XML解析器解析的文本数据,如包含大量特殊字符(如<&等)的文本。CDATA区以<![CDATA[开始,以]]>结束。

例如:

<![CDATA[这是一个包含<和&等特殊字符的文本。]]>

命名空间:

命名空间用于避免元素名称冲突,通过前缀来标识命名空间。命名空间声明通常放在根元素上,使用xmlns属性来定义。

例如:

<ns:book xmlns:ns="http://www.gayboys.com"><ns:title>舔狗基础教程</ns:title><ns:author>阿斌</ns:author>
</ns:book>

XML编写注意事项:

  • XML文档有且仅有一个根元素,所有其他元素都必须是根元素的子元素。
  • 元素名不能以数字或特殊字符开头,可以包含字母、数字、下划线和点号,但不能包含空格。
  • 标签名大小写敏感。
  • 属性值必须用引号括起来。
  • 注释不能嵌套,也不能出现在XML声明之前。
  • XML语法非常严格,任何微小的错误都可能导致解析失败。

除了XML之外,YAML也是一种广受欢迎的结构化文本数据系统,它特别强调文档的人类可读性。在R中,yaml包为YAML格式的支持提供了便捷的途径,使得用户可以轻松地读取和写入YAML文件,进一步丰富了数据处理与交换的选项。

本次使用的XML文件如下:
XML文件:

<?xml version="1.0" encoding="UTF-8"?>  
<library>  <book>  <title>欢乐 Gay Boys</title>  <author>GGBoy</author>  <genre>教科书</genre>  <price>114.514</price>  <publish_date>2024-09-01</publish_date>  <description>属于统计学专业学生的高级搞基指南</description>  </book>  <book>  <title>快乐R语言</title>  <author>GGGirl</author>  <genre>教科书</genre>  <price>6.66</price>  <publish_date>2023-12-16</publish_date>  <description>属于统计学专业学生的高级拉拉指南</description>  </book>  
</library>

YAML文件简介

YAML是"YAML Ain’t Markup Language"(YAML不是一种标记语言)的递归缩写,但实际上它意味着“Yet Another Markup Language”(仍是一种标记语言)。YAML是一种用于数据序列化的基于文本的标记语言,其强调以数据为中心,旨在方便人类使用,因此被广泛认为是一种人性化的数据格式语言。以下是YAML的详细介绍:

YAML的特点
  1. 可读性高:YAML语法清晰,易于阅读和书写,特别适合表达或编辑数据结构、配置文件等。
  2. 简洁性:相比JSON,YAML的语法更简洁,更适合用于配置文件。
  3. 数据类型丰富:能够表示字符串、数字、数组(列表)、对象(映射)等多种数据类型,且支持注释和多行字符串。
  4. 缩进敏感:YAML使用缩进来表示层级关系,不允许使用制表符进行缩进,且缩进的空格数在同一层级内保持一致即可。
  5. 扩展性强:YAML易于与其他编程语言集成,支持数据类型的自动转换。
YAML的应用场景
  1. 配置文件:许多编程语言和框架采用YAML作为配置文件的格式,如Spring Boot、Ansible等。
  2. 数据交换:YAML常和JSON一起被用作应用程序之间的数据交换格式。
  3. API文档:YAML是API文档的标准格式之一,用于描述API的接口、参数、返回值等信息。
  4. 容器编排:在容器化部署和云原生领域,YAML文件用于描述Kubernetes等资源定义。
YAML的基本语法
  1. 对象/映射(Mapping):键值对集合,每个键值对占一行,使用冒号(:)分隔键和值,值紧跟冒号后,并且前面可以有空格。

    user: admin
    password: 123456
    
  2. 数组/序列(Sequence):一组按照次序排列的值,每项前加短横线(-),与父元素直接可以缩进一个空格。

    fruits:- apple- banana- cherry
    
  3. 注释:从#开始到行末的部分被视为注释,可以放在值的前面或后面,也可以在标量值的上方或下方编写。

    # 这是一个注释
    user: admin # 这也是注释
    
  4. 字符串:默认不加引号,当字符串包含特殊字符时,需使用双引号括起来。

    greeting: "Hello, World!"
    
  5. 数值和布尔值:直接表示,不需要特殊符号。

    age: 30
    is_active: true
    

YAML的这些特点和语法规则使其成为一种非常灵活且易于使用的数据序列化格式,在多个领域都有广泛的应用。
这次使用的YAML文件内容如下:

library:  books:  - title: "R语言基础"  author: "Gambardella, Matthew"  genre: "Computer"  price: 44.95  publish_date: "2000-10-01"  description: "An in-depth look at creating applications with R."  - title: "R语言进阶"  author: "Ralls, Kim"  genre: "Computer"  price: 5.95  publish_date: "2000-12-16"  description: "A former architect battles corporate zombies, an evil sorceress, and her own childhood to become queen of the world."

使用R语言对XML文件与YAML文件进行操作

在进行操作前先在交互页面下载这三个R包:

install.packages("XML")  # 处理XML数据  
install.packages("xml2")  # 另一个处理XML数据的包,基于libxml2 C库 
install.packages("yaml")  # 处理YAML数据  

在上述三个R包中,xml2包的设计哲学是更侧重于读取和解析XML数据而不是修改XML数据,因此在实际应用中,如果需要频繁地修改XML文档,可能会需要考虑使用其他工具或语言。
R语言通常不适合处理大规模数据的操作,而其他数据分析系统在这方面表现的会更好些,因此官方文档建议:与其在R中复制功能,不如让另一个数据分析系统来完成数据操作工作。例如有团队指出,他们倾向于在SAS、SSAS中进行数据操作,然后使用R中的survival包进行分析。

XML文件基础操作

在进行操作前先加载xml2包或XML包:

library(xml2)
读取XML文件

我这里导入的xml2包,使用read_xml()函数来读取XML文件:

# 读取XML文件
xml_data <- read_xml("books.xml")
print(xml_data)

使用XML包中的xmlParse()函数操作代码如下:

xml_data <- xmlParse(file = "books.xml")  
print(xml_data)

代码运行结果如下:
在这里插入图片描述

获取根节点

使用包中的xml_root()函数:

root_node <- xml_root(xml_data)
print(root_node)

在这里插入图片描述

获取特定节点集
# 获取所有<book>节点
books <- xml_find_all(xml_doc, "//book")
print(books)

在这里插入图片描述

提取单个节点的信息

建立一个变量first_book通过索引来实现从books.xml文档中找到第一本书籍的节点,接下来从first_book节点中提取各个子节点的信息,如标题、作者、类型、价格、出版日期和描述。
代码中:xml_find_first函数用于在first_book节点下查找第一个匹配的子节点。
xml_text函数则用于提取该子节点的文本内容。
这里价格(price)通常是以文本形式存储的,需要使用as.numeric函数将其转换为数值类型。

# 提取第一个<book>节点的所有子节点信息
first_book <- books[1]
title <- xml_text(xml_find_first(first_book, "title"))
author <- xml_text(xml_find_first(first_book, "author"))
genre <- xml_text(xml_find_first(first_book, "genre"))
price <- as.numeric(xml_text(xml_find_first(first_book, "price")))
publish_date <- xml_text(xml_find_first(first_book, "publish_date"))
description <- xml_text(xml_find_first(first_book, "description"))# 打印提取的信息
cat("Title:", title, "\nAuthor:", author, "\nGenre:", genre, "\nPrice:", price, "\nPublish Date:", publish_date, "\nDescription:", description, "\n")

在这里插入图片描述

提取所有书籍的信息

这里使用for循环来遍历书籍的列表信息:

# 初始化一个列表来存储所有书籍的信息
all_books_info <- list()# 遍历所有<book>节点并提取信息
for (book in books) {book_info <- list(title = xml_text(xml_find_first(book, "title")),author = xml_text(xml_find_first(book, "author")),genre = xml_text(xml_find_first(book, "genre")),price = as.numeric(xml_text(xml_find_first(book, "price"))),publish_date = xml_text(xml_find_first(book, "publish_date")),description = xml_text(xml_find_first(book, "description")))all_books_info <- append(all_books_info, list(book_info))
}# 打印所有书籍的信息
print(all_books_info)

在这里插入图片描述

添加新节点并保存到新文件

xml2包本身不直接支持修改XML文档,可以通过创建新的XML节点和结构,然后将其写入到新的XML文件中来实现。

# 创建新的XML文档
new_xml_doc <- xml_new_document()
new_root <- xml_add_child(new_xml_doc, "library")# 创建新<book>节点及其子节点
new_book <- xml_add_child(new_root, "book")
xml_add_child(new_book, "title", "数据科学导论")
xml_add_child(new_book, "author", "DataGuy")
xml_add_child(new_book, "genre", "教科书")
xml_add_child(new_book, "price", "59.99")
xml_add_child(new_book, "publish_date", "2024-12-01")
xml_add_child(new_book, "description", "数据科学的基础教程")# 打印新的XML文档
print(new_xml_doc)# 将新的XML文档保存到另一个文件
write_xml(new_xml_doc, "new_books.xml")

新建的XML文档内容如下:
在这里插入图片描述

YAML文件基础操作

加载yaml

library(yaml)

读取YAML文件
使用的read_yaml()文件:

yaml_content <- read_yaml("books.yaml")
print(yaml_content)

代码运行后输出如下:
在这里插入图片描述

访问YAML文件中的内容
这里访问的第一个书目的标题和作者。

first_book_title <- yaml_content$library$books[[1]]$title
first_book_author <- yaml_content$library$books[[1]]$author
cat("Title:", first_book_title, "\nAuthor:", first_book_author, "\n")

在这里插入图片描述

添加一个新的条目到YAML文件中

new_book <- list(title = "R语言数据分析",author = "Doe, John",genre = "Computer",price = 39.95,publish_date = "2021-05-21",description = "A comprehensive guide to data analysis with R."
)yaml_content$library$books <- c(yaml_content$library$books, list(new_book))

在这里插入图片描述

修改现有书目的信息
例如,修改第一个书目的价格。

yaml_content$library$books[[1]]$price <- 49.95

删除一个书目
例如,删除第二个书目。

yaml_content$library$books <- yaml_content$library$books[-2]

将修改后的内容写回YAML文件

write_yaml(yaml_content, "new_books.yaml")

将R对象转换为YAML字符串
例如,将第一个书目对象转换为YAML字符串。

first_book_yaml <- as.yaml(yaml_content$library$books[[1]])
cat(first_book_yaml)

在这里插入图片描述

从YAML字符串解析回R对象

parsed_book <- yaml.load(first_book_yaml)
print(parsed_book)

在这里插入图片描述

验证YAML文件的正确性
这个方法仅适用于读取和解析YAML文件

tryCatch({yaml_content <- read_yaml("books.yaml")cat("YAML file is valid.\n")
}, error = function(e) {cat("YAML file is invalid: ", e$message, "\n")
})

在这里插入图片描述

xml2包函数表格

这个表格中doc是一个通过read_xml()函数读取的XML文档对象.

函数名作用范例
read_xml读取XML文档并返回一个xml_document对象doc <- read_xml("<root><child>Text</child></root>")
xml_name获取XML节点的名称name <- xml_name(xml_children(doc)[[1]])
xml_text获取XML节点的文本内容text <- xml_text(xml_find_all(doc, "//child"))
xml_attr获取XML节点的属性值attr <- xml_attr(xml_find_first(doc, "//child"), "attribute")
xml_add_child向XML节点添加子节点new_child <- xml_add_child(doc, "new_child", "New Text")
xml_set_attr设置XML节点的属性xml_set_attr(xml_find_first(doc, "//child"), "new_attr", "value")
xml_remove移除XML节点或属性xml_remove(xml_find_first(doc, "//new_child"))
xml_find_all查找所有匹配的XML节点nodes <- xml_find_all(doc, "//child")
xml_find_first查找第一个匹配的XML节点node <- xml_find_first(doc, "//child")
xml_children获取XML节点的子节点children <- xml_children(doc)
xml_parent获取XML节点的父节点parent <- xml_parent(xml_find_first(doc, "//child"))
xml_siblings获取XML节点的兄弟节点siblings <- xml_siblings(xml_find_first(doc, "//child"))
xml_ns获取或设置XML文档的命名空间ns <- xml_ns(doc)
xml_ns_strip移除XML文档中的所有命名空间声明doc_no_ns <- xml_ns_strip(doc)
xml_parse已弃用,使用read_xml-
xml_serialize已弃用-

YAML包函数表格

函数名作用范例
read_xml读取XML文档并返回一个xml_document对象doc <- read_xml("<root><child>Text</child></root>")
xml_name获取XML节点的名称name <- xml_name(xml_children(doc)[[1]])
xml_text获取XML节点的文本内容text <- xml_text(xml_find_all(doc, "//child"))
xml_attr获取XML节点的属性值attr <- xml_attr(xml_find_first(doc, "//child"), "attribute")
xml_add_child向XML节点添加子节点new_child <- xml_add_child(doc, "new_child", "New Text")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1527647.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

kubeadm 初始化 k8s 证书过期解决方案

概述 在使用 kubeadm 初始化的 Kubernetes 集群中&#xff0c;默认情况下证书的有效期为一年。当证书过期时&#xff0c;集群中的某些组件可能会停止工作&#xff0c;导致集群不可用。本文将详细介绍如何解决 kubeadm 初始化的 Kubernetes 集群证书过期的问题&#xff0c;并提…

CSP-J基础之常见的竞赛题库

文章目录 CSP-J基础之常见的竞赛题库1. 可达 (KEDA)2. 洛谷 (Luogu)3. Codeforces 洛谷账号的注册总结 CSP-J基础之常见的竞赛题库 在备战CSP-J&#xff08;Certified Software Professional Junior&#xff09;及其他信息学竞赛时&#xff0c;选手们常需要借助在线题库来进行…

android framework工程师遇到成长瓶颈迷茫怎么办?千里马经验分享

背景 近来有一些framework老司机粉丝朋友发来了一些framework工作中的一些疑问&#xff0c;具体描述如下&#xff1a; 这个同学遇到的问题&#xff0c;其实就是大部分framework开发者工作比较久后遇到的一个上升瓶颈问题。 具体总结有以下几个瓶颈问题 1、framework属于系…

Clion不识别C代码或者无法跳转C语言项目怎么办?

如果是中文会显示&#xff1a; 此时只需要右击项目&#xff0c;或者你的源代码目录&#xff0c;将这个项目或者源码目录标记为项目源和头文件即可。 英文如下&#xff1a;

STM32内部闪存FLASH(内部ROM)、IAP

1 FLASH简介 1 利用程序存储器的剩余空间来保存掉电不丢失的用户数据 2 通过在程序中编程(IAP)实现程序的自我更新 &#xff08;OTA&#xff09; 3在线编程&#xff08;ICP把整个程序都更新掉&#xff09; 1 系统的Bootloader写死了&#xff0c;只能用串口下载到指定的位置&a…

【MacOS】mac定位服务中删除已经卸载的软件

mac定位服务中删除已经卸载的软件 网上的帖子真不靠谱 直接右键 WeTypeSettings &#xff0c;查找位置&#xff0c;丢废纸篓即可&#xff01;会提示你卸载的&#xff01;

VLAN原理学习笔记

以太网是一种基于CSMA/CD的数据网络通信技术&#xff0c;其特征是共享通信介质。当主机数目较多时会导致安全隐患、广播泛滥、性能显著下降甚至造成网络不可用。 在这种情况下出现了VLAN (Virtual Local Area Network)技术解决以上问题。 1、VLAN快速配置 Vlan:Virtual Local…

C和指针:结构体(struct)和联合(union)

结构体和联合 结构体 结构体包含一些数据成员&#xff0c;每个成员可能具有不同的类型。 数组的元素长度相同&#xff0c;可以通过下标访问(转换为指针)。但是结构体的成员可能长度不同&#xff0c;所以不能用下标来访问它们。成员有自己的名字&#xff0c;可以通过名字访问…

springboot流浪天使乐园管理系统

基于springbootvue实现的流浪天使乐园管理系统&#xff08;源码L文ppt&#xff09;4-039 第4章 系统设计 4.1 总体功能设计 一般个人用户和管理者都需要登录才能进入流浪天使乐园管理系统&#xff0c;使用者登录时会在后台判断使用的权限类型&#xff0c;包括一般使用者…

以太网交换机工作原理学习笔记

在网络中传输数据时需要遵循一些标准&#xff0c;以太网协议定义了数据帧在以太网上的传输标准&#xff0c;了解以太网协议是充分理解数据链路层通信的基础。以太网交换机是实现数据链路层通信的主要设备&#xff0c;了解以太网交换机的工作原理也是十分必要的。 1、以太网协议…

Qt/C++编写的Onvif调试助手调试神器工具/支持云台控制/预置位设置等/有手机版本

一、功能特点 广播搜索设备&#xff0c;支持IPC和NVR&#xff0c;依次返回。可选择不同的网卡IP进行对应网段设备的搜索。依次获取Onvif地址、Media地址、Profile文件、Rtsp地址。可对指定的Profile获取视频流Rtsp地址&#xff0c;比如主码流地址、子码流地址。可对每个设备设…

ESP32_获取心知天气

目录 前言 一、获取心知天气API 二、编写代码 1.下载代码 2.代码讲解 1.安装Arduino.Json库 2.输入WIFI名称和密码 3.添加API 4.关于API的补充 三.数据的打印和处理 1.获取的数据 2.数据输出 总结 前言 环境&#xff1a;Arduino 芯片&#xff1a;ESP32 软件&…

基于springboot+vue实现的农家乐管理系统

基于springbootvue实现的山庄农家乐管理系统前后端分离项目&#xff08;文末查看源码lw&#xff09;4-10 系统角色&#xff1a; 管理员、用户 主要功能&#xff1a; &#xff08;1&#xff09;用户关键功能包含用户注册登陆、个人信息修改、首页、农家乐、美食信息、民宿信息…

【LeetCode】20.有效的括号

题目要求 解题思路 利用栈来解决本道题&#xff0c;左括号进栈&#xff0c;右括号出栈。需要判断第一个字符是右括号的情况 代码实现 class Solution { public:bool isValid(string s) {//利用栈来解决stack<char> st;for(auto& e:s){//是左括号就进if(e(||e[||…

SpringBoot开启多端口探究--基于多ApplicationContext

文章目录 前情提要一、思路概要二、具体实现三、其他问题父子关系部分依赖 总结 前情提要 前面探讨了management端口开启&#xff0c;grpc端口开启&#xff0c;本文继续探讨在SpringApplication中开启多个端口的方式之多ApplicationContext, 相比management端口基于多WebServe…

java计算机毕设课设—停车管理信息系统(附源码、文章、相关截图、部署视频)

这是什么系统&#xff1f; 资源获取方式在最下方 java计算机毕设课设—停车管理信息系统(附源码、文章、相关截图、部署视频) 停车管理信息系统是为了提升停车场的运营效率和管理水平而设计的综合性平台。系统涵盖用户信息管理、车位管理、收费管理、违规车辆处理等多个功能…

基于Spring Boot的火车订票管理系统

你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;JAVA语言 Spring Boot框架 工具&#xff1a;IDEA/Eclipse、Navicat、Tomcat 系统展示 首页 管理…

【动手学深度学习】05 线性代数(个人向笔记)

1. 线性代数 向量的一些公式 ∣ ∣ a ∣ ∣ ||a|| ∣∣a∣∣ 表示向量 a 的范数&#xff0c;课上没有讲范数的概念 其中第一条为求向量的二范数 第四条表示如果a为标量&#xff0c;那么向量 ∣ ∣ a ⋅ b ∣ ∣ ||ab|| ∣∣a⋅b∣∣ 的长度等于 ∣ a ∣ ⋅ ∣ ∣ b ∣ ∣…

Ifream实现微前端效果

记得有人曾问过我&#xff0c;老旧的项目内容很多&#xff0c;项目卡&#xff0c;想要改造成类似微前端&#xff0c;领导想要快速&#xff0c;又不想系统重构、而且是不同子系统的协同&#xff0c;要怎么做&#xff1f;对方不想做太大的改造&#xff0c;所以想用ifream的方式动…

编程效率飙升的秘密武器:Cursor编辑器的AI革命

有没有想过,写代码这件事其实可以更加轻松、高效?尤其是对于那些需要频繁修正、调试和优化的开发者们,Cursor编辑器带来的AI赋能,简直让人眼前一亮。相信很多人一提到AI,第一反应就是:“这真的靠谱吗?”今天,我就带你来揭开Cursor这款AI编辑器的神秘面纱,看看它是如何…