文章目录

  • 写在篇前
  • 向量
  • 矩阵
  • 数组
  • 因子
  • 数据框
    • 构建数据框
    • 观察数据
    • 行名、列名
    • 获取行数据、列数据
    • 添加列
    • 数据类型转换
    • 子集查询
    • 数据合并
  • 列表
  • 其他

写在篇前

  本篇主要总结R语言中六大基本数据结构的基本概念和常用操作,包括向量(Vector)、矩阵(Matrix)、数组(Array)、因子(Factor)、数据框(Data.Frame)、列表(List)。这六大基本数据结构和R语言流程控制是我们编写R脚本的基石,再结合R语言丰富的函数以及社区开发Package,我们就能应用R语言做很多非常Cool的事情。

向量

  向量是用于存储数值型、字符型或逻辑型数据的一维数组。执行组合功能的函数c()可用来创建向量。注意,单个向量中的数据必须拥有相同的类型或模式(数值型、字符型或逻辑型) ,如:

> a = c(1,2,3,4,5)
> mode(a)  # 说明这是一个数值型存储的向量
[1] "numeric"

  向量是一个常用并且非常简单的数据结构,主要需要注意一下向量元素的索引(R语言的数据结构的下标是从1开始的)以及数据类型转换:

# 创建向量
> a = c(1,2,3,4,5)
> b = c(1:5)
> c_ = c("1","2","3","4","5")
> d = c(T,F,T,T,F)# 数据类型相关操作
> typeof(a)
[1] "double"
> mode(a)
[1] "numeric"
> class(a)
[1] "numeric"> is.numeric(a)
[1] TRUE
> is.double(a)
[1] TRUE> as.character(a)
[1] "1" "2" "3" "4" "5"
> as.character(a) == b
[1] TRUE TRUE TRUE TRUE TRUE# 索引向量元素
> a[1]
[1] 1
> a[2:4]
[1] 2 3 4
> a[c(2,4)]
[1] 2 4

矩阵

  矩阵是一个二维数组,只是每个元素都拥有相同的模式(数值型、字符型或逻辑型),可通

过函数matrix创建矩阵。一般使用格式为:

mymatrix <- matrix(vector, nrow,ncol,byrow=T,dimnames=list(char_verctor_rownames,char_vector_colnames))

  其中vector包含了矩阵的元素,nrowncol用以指定行和列的维数,dimnames包含了可选的、

以字符型向量表示的行名和列名。选项byrow则表明矩阵应当按行填充(byrow=TRUE)还是按

列填充(byrow=FALSE) ,默认情况下按列填

> nums = 1:4
> rnames = c('r1','r2')
> cnames = c('c1','c2')> matrix_obj = matrix(nums,nrow=2,dimnames=list(c(),cnames))
> matrix_objc1 c2
[1,]  1  3
[2,]  2  4> matrix_obj = matrix(nums,nrow=2,dimnames=list(rnames,cnames)
+ )
> matrix_objc1 c2
r1  1  3
r2  2  4

  可以使用下标和方括号来选择矩阵中的行、列或元素。X[i,]指矩阵X中的第i 行,X[,j]

指第j 列,X[i, j]指第i 行第j 个元素,选择多行或多列时,下标i 和j 可为数值型向量。

> a = matrix(1:20,nrow=5)
> a[,1] [,2] [,3] [,4]
[1,]    1    6   11   16
[2,]    2    7   12   17
[3,]    3    8   13   18
[4,]    4    9   14   19
[5,]    5   10   15   20# 索引单个数据
> a[1]
integer(1)
> a[7]
[1] 7
# 索引行
> a[1,]
[1]  1  6 11 16
> matrix_obj['r1',]
c1 c2 1  3
# 索引列
> a[,1:2][,1] [,2]
[1,]    1    6
[2,]    2    7
[3,]    3    8
[4,]    4    9
[5,]    5   10
> matrix_obj[,'c1']
r1 r2 1  2
# 综合
> a[1:2,2:3][,1] [,2]
[1,]    6   11
[2,]    7   12

数组

  数组(array)与矩阵类似,但是维度可以大于2。数组可通过array函数创建,形式如下:

myarray <- array(vector,dimensions,dimnames)

  其中vector包含了数组中的数据,dimensions是一个数值型向量,给出了各个维度下标的最大

值,而dimnames是可选的、各维度名称标签的列表:

> dim1 = c('A1','A2')
> dim2 = c('B1','B2','B3')
> dim3 = c('C1','C2','C3','C4')
> z = array(1:24,c(2,3,4),dimnames=list(dim1,dim2,dim3))  # 由此创建了一个2*3*4的数组

  这里特别需要注意的是这些数在空间上的延伸顺序,此数组可以看作4个2*3的矩阵,各个矩阵中依次按列延伸。因此,该矩阵如下:

> z
, , C1B1 B2 B3
A1  1  3  5
A2  2  4  6, , C2B1 B2 B3
A1  7  9 11
A2  8 10 12, , C3B1 B2 B3
A1 13 15 17
A2 14 16 18, , C4B1 B2 B3
A1 19 21 23
A2 20 22 24

  与前面相同,我们需要关注数组的索引操作,基本和向量、矩阵如出一辙:

# 索引元素
> z[1,1,3]
[1] 13# 综合索引
> z[1:2,1:3,2]B1 B2 B3
A1  7  9 11
A2  8 10 12
> z[c('A1','A2'),c('B1','B2','B3'),'C2']B1 B2 B3
A1  7  9 11
A2  8 10 12

因子

变量可以归结为以下几种:

  • 名义型

    名义型变量是没有顺序之分的类别 变量。糖尿病类型Diabetes(Type1、Type2)是名义型变量的一例。即使在数据中Type1编码为1而Type2编码为2,这也并不意味着二者是有序的。

  • 有序型

    有序型变量表示一种顺序关系,而非数量关系。病情Status(poor, improved, excellent)是顺序型变量的一个上佳示例。我们明白, 病情为poor(较差)病人的状态不如improved(病情好转)的病人,但并不知道相差多少。

  • 连续型

    连续 型变量可以呈现为某个范围内的任意值,并同时表示了顺序和数量。年龄Age就是一个连续型变

    量,它能够表示像14.5或22.8这样的值以及其间的其他任意值。

  类别(名义型)变量和有序类别(有序型)变量在R中称为因子(factor),函数factor()以一个整数向量的形式存储类别值,整数的取值范围是[ 1 … k ](其中k 是名义型变量中唯一值的个数) ,同时一个由字符串(原始值)组成的内部向量将映射到这些整数。

因子主要有以下几种情况:

  • 名义型变量因子

    > diabetes = c("Type1","Type2","Type1","Type2")
    > diabetes = factor(diabetes)
    > diabetes
    [1] Type1 Type2 Type1 Type2
    Levels: Type1 Type2> str(diabetes)Factor w/ 2 levels "Type1","Type2": 1 2 1 2
    > summary(diabetes)
    Type1 Type2 2     2
    
  • 有序型变量因子

    > status = c("Poor","Imporved","Excellent","Poor")
    > status = factor(status,ordered=TRUE)
    > status
    [1] Poor      Imporved  Excellent Poor
    Levels: Excellent < Imporved < Poor> str(status)Ord.factor w/ 3 levels "Excellent"<"Imporved"<..: 3 2 1 3
    > summary(status)
    Excellent  Imporved      Poor 1         1         2
    
  • 自定义因子水平顺序

    > status = c("Poor","Improved","Excellent","Poor")
    > status = factor(status,ordered=TRUE,levels=c("Poor","Improved","Excellent"),labels=c("bad","middle","good"))
    > status
    [1] bad    middle good   bad
    Levels: bad < middle < good
    > str(status)Ord.factor w/ 3 levels "bad"<"middle"<..: 1 2 3 1
    > summary(status)bad middle   good 2      1      1
    

数据框

  数据框(data.frame)可以理解为二维数据表,每一行代表一条记录,每一列代表一个属性。不同于矩阵,数据框中每一列的数据类型可以不同,更加灵活多变、应用广泛,比如Excel数据导入R中处理一般就采用该种数据类型。数据框的操作稍微更复杂,以下主要例举基本的数据框构建、行列名操作、子集操作、数据类型转换、查询合并等方面。

构建数据框

# 最基本的初始化方式
students<-data.frame(ID=c(1,2,3),Name=c("jeffery","tom","kim"),Gender=c("male","male","female"),Birthdate=c("1986-10-19","1997-5-26","1998-9-8"))

观察数据

> summary(students)ID           Name      Gender       BirthdateMin.   :1.0   jeffery:1   female:1   1986-10-19:1  1st Qu.:1.5   kim    :1   male  :2   1997-5-26 :1  Median :2.0   tom    :1              1998-9-8  :1  Mean   :2.0                                        3rd Qu.:2.5                                        Max.   :3.0
> str(students)
'data.frame': 3 obs. of  4 variables:$ ID       : num  1 2 3$ Name     : Factor w/ 3 levels "jeffery","kim",..: 1 3 2$ Gender   : Factor w/ 2 levels "female","male": 2 2 1$ Birthdate: Factor w/ 3 levels "1986-10-19","1997-5-26",..: 1 2 3

行名、列名

# 获取行名、列名
> row.names(students)
[1] "1" "2" "3"
> rownames(students)
[1] "1" "2" "3"> names(students)
[1] "ID"        "Name"      "Gender"    "Birthdate"
>colnames(students)
[1] "ID"        "Name"      "Gender"    "Birthdate"# 设置列名、行名
> row.names(students)<-c("001","002","003")
> rownames(students)<-c("001","002","004")> names(students)<-c("id",'name','gender','birthday')
> colnames(students)<-c("id",'name','gender','birth')

获取行数据、列数据

  需要注意的是R语言的下标是从1开始

# 获取列
> students$name
[1] jeffery tom     kim
Levels: jeffery kim tom> students[,2]
[1] jeffery tom     kim
Levels: jeffery kim tom> students[[2]]
[1] "jeffery" "tom"     "kim" > students[2]name
001 jeffery
002     tom
004     kim> students['name']name
001 jeffery
002     tom
004     kim> students[c('id','name')]id    name
001  1 jeffery
002  2     tom
004  3     kim> students[1:2]id    name
001  1 jeffery
002  2     tom
004  3     kim# 获取行
> students[1,]ID    Name Gender  Birthdate
1  1 jeffery   male 1986-10-19# 获取列和行
> students[2:3,2:4]name gender     birth
002  tom   male 1997-5-26
004  kim female  1998-9-8

  在复杂操作时,可以使用以下代码简化代码:

# attach、detach
> attach(students)
> name<-name
> detach(students)
> name
[1] jeffery tom     kim
Levels: jeffery kim tom# with
> with(students,{
+     name<-name
+ })
> print(name)
[1] jeffery tom     kim
Levels: jeffery kim tom

  但是上面的with有一种情况需要注意,当要在{}中对存在的全局变量赋值时,需要使用<<-进行赋值:

# 01
name<-c(1,2,3)
> with(students,{
+ name<-name
+ })
> name  # 你会发现,结果和上面不一样
[1] 1 2 3# 02
> name<-c(1,2,3)
> with(students,{
+ name<<-name
+ })
> name  # 此时效果将和上面一样
[1] jeffery tom     kim
Levels: jeffery kim tom

添加列

> students$Age<-as.integer(format(Sys.Date(),"%Y"))-as.integer(format(as.Date(students$Birthdate),"%Y"))
> students<-within(students,{
Age<-as.integer(format(Sys.Date(),"%Y"))-as.integer(format(as.Date(Birthdate),"%Y"))
})

数据类型转换

student$Name<-as.character(student$Name)
student$Birthdate<-as.Date(student$Birthdate)

子集查询

> students[which(students$Gender=="male"),]  # 获取性别是male的数据行> students[which(students$Gender=="male"),"Name"]  # 获取性别是male的名字
[1] jeffery tom
Levels: jeffery kim tom> subset(students,Gender=="male" & Age<30 ,select=c("Name","Age"))Name Age
2  tom  22> library(sqldf)
> result<-sqldf("select Name,Age from student where Gender='male' and Age<30")

数据合并

# inner join
score<-data.frame(SID=c(1,1,2,3,3),Course=c("Math","English","Math","Chinese","Math"),Score=c(90,80,80,95,96))
> result<-merge(students,score,by.x="ID",by.y="SID")
> resultID    Name Gender  Birthdate Age  Course Score
1  1 jeffery   male 1986-10-19  33    Math    90
2  1 jeffery   male 1986-10-19  33 English    80
3  2     tom   male  1997-5-26  22    Math    80
4  3     kim female   1998-9-8  21 Chinese    95
5  3     kim female   1998-9-8  21    Math    96# rbind
> student2<-data.frame(ID=c(21,22),Name=c("Yan","Peng"),Gender=c("female","male"),Birthdate=c("1982-2-9","1983-1-16"),Age=c(32,31))
> rbind(student2, students)ID    Name Gender  Birthdate Age
1 21     Yan female   1982-2-9  32
2 22    Peng   male  1983-1-16  31
3  1 jeffery   male 1986-10-19  33
4  2     tom   male  1997-5-26  22
5  3     kim female   1998-9-8  21# cbind
> cbind(students, score[1:3,])ID    Name Gender  Birthdate Age SID  Course Score
1  1 jeffery   male 1986-10-19  33   1    Math    90
2  2     tom   male  1997-5-26  22   1 English    80
3  3     kim female   1998-9-8  21   2    Math    80

列表

  列表(list)是R的数据类型中最为复杂的一种。一般来说,列表就是一些对象(或成分,

component)的有序集合。列表允许你整合若干(可能无关的)对象到单个对象名下。例如,某个

列表中可能是若干向量、矩阵、数据框,甚至其他列表的组合。可以使用函数list()创建列表:

mylist <- list(obj1,bj2,...)
# or
mylist <-(name1=obj1,name2=obj2,...)

  以下展示列表的主要操作,包括构建列表、获取列表元素等:

# 构建
> a = 'My First List'
> b = c(1,2,3,4,5)
> c = matrix(1:10, nrow=5)
> d = c("1","2","3","4","5")
> mylist = list(title=a,months=b,c,d)
> mylist
$title
[1] "My First List"$months
[1] 1 2 3 4 5[[3]][,1] [,2]
[1,]    1    6
[2,]    2    7
[3,]    3    8
[4,]    4    9
[5,]    5   10[[4]]
[1] "1" "2" "3" "4" "5"# 索引方式(特别注意他们之间的区别)
> mylist[[1]]  # 返回list中对应元素
[1] "My First List"
> mylist[1]  # 返回的是list类型
$title
[1] "My First List"> mylist['title']  # 返回的是list类型
$title
[1] "My First List"
> mylist[['title']] # 返回list中对应元素
[1] "My First List"> mylist$title # 返回list中对应元素
[1] "My First List"# 所以不难推测,构建list的子集可以如下:
> mylist[c('title','months')]
$title
[1] "My First List"$months
[1] 1 2 3 4 5

其他

上面的示例代码中涉及可能涉及下面这些容易混淆的函数,在此,对这些函数进行总结归纳:

  • 上下文函数

    with和attach的区别就是,如果在with上下文中需覆盖全局变量的值,需要使用<<-符号,而attach会默认覆盖;within跟with功能相同,但返回值不同,within会返回所有修改生效后的原始数据结构(列表、数据框等),而with的返回值一般都被忽略。

    • with
    • attach、detach
    • within
  • 数据类型函数

     在R里面,每一个对象都有一个mode和一个class,前者表示对象在内存中是如何存储的 (numeric, character, list and function);后者表示对象的抽象类型。

    • typeof

      The Type of an Object

    • mode

      The (Storage) Mode of an Object

    • class

      R possesses a simple generic function mechanism which can be used for an object-oriented style of programming.Method dispatch takes place based on the class of the first argument to the generic function.

R语言入门3---R语言六大基本数据结构相关推荐

  1. go语言视频教程_ go语言入门视频教程_go语言实战视频教程

    许多人可能知道go语言的优点在哪里,但他们不知道go语言适合在哪里使用.通过学习go语言视频教程,可以清楚的知道go语言主要用于服务器端开发,其定位是用来开发"大型软件".学习go ...

  2. C语言入门——初识C语言

    C语言入门--初识C语言 一. C语言的起源 二. 选择C语言的原因 (一). 设计特性 (二). 高效性 (三). 可移植性 (四). 强大而灵活 (五). 面向程序员 (六). 缺点 三. C语言 ...

  3. 入门C语言模板,C语言入门经典-C语言编程

    C语言入门经典-C语言编程Tag内容描述: 1.第01章C语言编程,C语言是一种功能强大.简洁的计算机语言,通过它可以编写程序,指挥计算机完成指定的任务.我们可以利用C语言创建程序(即一组指令),并让 ...

  4. c语言编程培训ppt,C语言入门经典-C语言编程.ppt

    <C语言入门经典-C语言编程.ppt>由会员分享,可在线阅读,更多相关<C语言入门经典-C语言编程.ppt(27页珍藏版)>请在人人文库网上搜索. 1.第01章 C语言编程,C ...

  5. c语言入门经典doc,C语言入门经典C语言编程.ppt

    C语言入门经典C语言编程.ppt 第01章 C语言编程,C语言是一种功能强大.简洁的计算机语言,通过它可以编写程序,指挥计算机完成指定的任务.我们可以利用C语言创建程序即一组指令,并让计算机依指令行事 ...

  6. 编程入门c语言ppt,C语言入门经典-C语言编程.ppt

    <C语言入门经典-C语言编程.ppt>由会员分享,可在线阅读,更多相关<C语言入门经典-C语言编程.ppt(27页珍藏版)>请在装配图网上搜索. 1.第01章 C语言编程,C语 ...

  7. c语言入门数组,C语言入门之数组(2)

    二维数组 前面介绍的数组只有一个下标,称为一维数组, 其数组元素也称为单下标变量.在实际问题中有很多量是二维的或多维的, 因此C语言允许构造多维数组.多维数组元素有多个下标, 以标识它在数组中的位置, ...

  8. 小学生c语言入门ppt,C语言入门至精完整版46759.ppt

    C语言入门至精完整版46759 第10章 指针 C语言程序设计 第十章 指针 地址和指针的概念 变量的指针和指向变量的指针变量 数组与指针 字符串与指针 指向函数的指针 返回指针值的函数 指针数组和指 ...

  9. 01《Go语言入门》Go语言简介:历史背景、发展现状及语言特性

    这是我纯手写的<Go语言入门>,手把手教你入门Go.源码+文章,看了你就会

  10. r语言java环境安装_【R语言入门】R语言环境搭建

    说明 R 语言是一个功能十分强大的工具,几乎绝大多数的数据分析工作都可以在 R 中完成,并且拥有很极强的绘图功能支持,能让你手中的数据以各种姿势进行可视化呈现,而且支持 Windows.Mac OS. ...

最新文章

  1. delphi回调函数
  2. MFC——ComBox用法大全
  3. Callable与Future的介绍
  4. Request的学习笔记(属Servlet学习课程)
  5. 云适配签约比亚迪 构建统一工作平台
  6. 使用com.alibaba.druid.filter.config.ConfigTools进行加密和解密工具类
  7. 流量高峰时期的性能瓶颈有哪些、以及如何来解决
  8. js基础系列之函数调用与this
  9. 我不相信长夜将至,因为火把就在自己手中。
  10. 性能测试的实施及总结(二)
  11. 计算机与电视连接方式是什么,电脑投屏到电视机怎么设置(详解两者间的投屏方法)...
  12. javascript实现电话号码验证
  13. 怎么批量提取图片的文件名?
  14. 试用AI写作软件AI-WRITER.COM:重写(rewrite)功能测试简短报告
  15. 从网站流量指标开始,CSDN 如何洞察运营效果异动?丨评测来了
  16. RoBERTa VS BERT
  17. Python Django学习
  18. 让机器读懂人类:探索问答系统和机器阅读理解
  19. 关于亚马逊SP-API申请和亚马逊SP-API注册公共开发者的PII权限一些建议
  20. 江苏省二级计算机信息技术基础,江苏省计算机二级基础知识整理资料样稿.doc...

热门文章

  1. eval?python顺序列表模拟栈实现计算器
  2. TCP 可靠传输机制详解
  3. 07.suggester简述
  4. 03.body_search
  5. 测试点分析:1048 数字加密 (20分)_16行代码AC
  6. java servlet 多线程_java – 多线程GAE servlet来处理并发用户
  7. linux 显示器分辨率设置太小了,显示器不显示 如何在设置回来,当“显示设置”中的分辨率不可用时,如何使用xrandr设置自定义分辨率...
  8. hutool 读取扩展名文件_JPG,PNG,GIF,TIFF、SVG玩设计必须了解的文件格式你知道几个?...
  9. python内核大小_关于keras.layers.Conv1D的kernel_size参数使用介绍
  10. autocad软件提供的哪些功能可以提高设计效率?_节省80%制图时间:AutoCAD如何有效“手脑”结合,释放创作潜能?...