我是靠谱客的博主 活力镜子,最近开发中收集的这篇文章主要介绍R语言入门——数据类型和数据结构变量数据类型数据结构,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

变量

基本说明

R语言计算的过程中,通常需要使用变量来存放中间结果。变量相当于给定一个空间,只能保存一种数据结构,只保存最后一次被赋值的数据。无需事先声明。

命名规则

变量名应该尽可能简单、意义明确,命名遵循一定规律,以便与他人交流理解。

  1. 只能使用字母(区分大小写)、数字、下划线“_”和英文句点“.”给变量命名;
  2. 不能以数字、下划线作为开头;
  3. 若以句点开头,第二位不能是数字;
变量名有效性原因
var_name1.有效符合规则1~3
var_name%1.无效不符合规则1,即不能包括符号“%”
1var_name.无效不符合规则2,即不能以数字开头
_var_name.无效不符合规则2,即不能以下划线开头
.var_name.有效符合规则1~3
.1var_name.无效不符合规则3,即点开头后不可跟数字
# 模拟表格中的6种命名方式,结果可以看出仅有第1、5种符合命名规则
> var_name1.<-1
> var_name1.
[1] 1
> var_name%1.<-1
Error: unexpected input in "var_name%1.<-1"
> 1var_name.<-1
Error: unexpected symbol in "1var_name."
> _var_name.<-1
Error: unexpected symbol in "_var_name."
> .var_name.<-1
> .var_name.
[1] 1
> .1var_name.<-1
Error: unexpected symbol in ".1var_name."

赋值符号

标准语法为左箭头<-

反转赋值为右箭头->

等号=也可以赋值,但是是不标准语法,某些情况下会出现错误。我的理解是等号只能将右边的值赋值给左侧变量,无法进行相反的操作,当左侧为值右侧为变量时会出现问题。

> a<-1
> 2->b
> c=3
> a
[1] 1
> b
[1] 2
> c
[1] 3
# 等号赋值*错误*举例
> 4=d
Error in 4 = d: invalid (do_set) left-hand side to assignment
> rnorm(5) = x
Error in rnorm(5) = x :
target of assignment expands to non-language object

数据类型

R可以处理的数据类型包括数值型、整数型、字符型、逻辑型、复数型和原生型。

分类

数值型

R语言中数字的默认类型为数值型,在运算时需要注意其精度问题。当整数部分大于等于7位时,将舍弃小数部分,当整数部分小于7位时,与小数部分一起最多保留7位数字。

整数型

R语言中整数型需要在整数后加L来表示,如1L、-10L。

字符型

字符串类型,用单引号或双引号包围表示。

逻辑型

TRUE或FALSE。

复数型

R语言支持复数计算。

原型

直接使用二进制内容来进行保存和使用的类型。不常见。

几种特殊的数据

正无穷InF  负无穷-InF  不可能的值NaN  缺失值NA

NULL常用于函数的参数中,表示该参数未赋值

> k<-c(0/0,0/1,1/0,-1/0,NA)
> k
[1]
NaN
0
Inf -Inf
NA
> class(k)
[1] "numeric"
#
其实本质上还是数值型变量

判断方法

class()函数

typeof()函数

is.xxx()系列函数。 其中 is.numeric() 对 integer 和 double (双精度型)内容都返回真值。

is.integer(), is.double(), is.numeric(), is.logical(), is.character(), is.complex(), is.raw()

is.nan(), is.infinite(), is.finite()

# 数值型(numeric)
> a1<-1
> class(a1)
[1] "numeric"
> typeof(a1)
[1] "double"
# 整数型(integer)
> a2<-1L
> class(a2)
[1] "integer"
> typeof(a2)
[1] "integer"
# 数值型(numeric)
> b<-3.9
> class(b)
[1] "numeric"
> typeof(b)
[1] "double"
# 字符型(character)
> c<-'B'
> class(c)
[1] "character"
# 逻辑型(logical)
> d<-TRUE
> class(d)
[1] "logical"
# 复数型(complex)
> e<-3+2i
> class(e)
[1] "complex"
# 原型(raw)
> f<-charToRaw("Hello")
> class(f)
[1] "raw"

转换

as.xxx()系列函数。

as.integer(), as.double(), as.numeric(), as.logical(), as.character(), as.complex(), as.raw()

数据结构

R中用于储存数据的结构包括标量、向量、矩阵、数组、数据框和列表。

分类

标量

仅含有一个元素的向量。常用于保存常量。

> a<-3.14
> b<-'B'
> c<-FALSE

向量

用于储存数值型、字符型或逻辑型数据的一维数组。单个向量中的数据必须为相同类型。

通过c()创建向量:

> v1<-c(1:6)
> v2<-c('DOG','CAT','SHEEP')
> v3<-c(TRUE,FALSE,TRUE,FALSE,TRUE)
> v4<-c(1:5)
> names(v4)<-c('A','B','C','D','E')
#
给向量的每个值命名
> vector4
A B C D E
1 2 3 4 5 

如果单个向量中的数据类型不同,会发生什么情况呢?

# 同时有数值型和逻辑型时,逻辑型TURE对应1,FALSE对应0
> v4<-c(1,TRUE,FALSE)
> v4
[1] 1 1 0
# 同时有数值型和字符型时,都储存为字符型
> v5<-c(1,'DOG',3,'CAT')
> v5
[1] "1"
"DOG" "3"
"CAT"
# 同时有数值型、逻辑型和字符型时,都储存为字符型
> v6<-c(1,FALSE,'SHEEP')
> v6
[1] "1"
"FALSE" "SHEEP"

矩阵

二维数组。单个矩阵中的数据必须为相同类型。

通过matrix()创建矩阵:

# 创建一个3行4列的矩阵
> matrix1<-matrix(c(1:12),3,4)
> matrix1
[,1] [,2] [,3] [,4]
[1,]
1
4
7
10
[2,]
2
5
8
11
[3,]
3
6
9
12
# 创建一个3行4列的矩阵,值按行填充(默认按列填充)
> matrix2<-matrix(c(1:12),3,4,byrow = T)
> matrix2
[,1] [,2] [,3] [,4]
[1,]
1
2
3
4
[2,]
5
6
7
8
[3,]
9
10
11
12
# 创建一个3行4列的矩阵,同时命名行名和列名
> matrix3<-matrix(c(1:12),3,4,,
+
dimnames = list(c('A','B','C'),c('a','b','c','d')))
> matrix3
a b c
d
A 1 4 7 10
B 2 5 8 11
C 3 6 9 12
# 创建一个3行4列的矩阵,之后命名行名和列名
> matrix4<-matrix(c(1:12),3,4)
> rownames(matrix4)<-c('A','B','C')
> colnames(matrix4)<-c('a','b','c','d')
> matrix4
a b c
d
A 1 4 7 10
B 2 5 8 11
C 3 6 9 12

数组

与矩阵类似,维度可以大于2。单个数组中的数据必须为相同类型。

通过array()创建数组:

# 创建一个三维数组
> array1<-array(c(1:24),dim=c(2,4,3))
> array1
, , 1
[,1] [,2] [,3] [,4]
[1,]
1
3
5
7
[2,]
2
4
6
8
, , 2
[,1] [,2] [,3] [,4]
[1,]
9
11
13
15
[2,]
10
12
14
16
, , 3
[,1] [,2] [,3] [,4]
[1,]
17
19
21
23
[2,]
18
20
22
24
# 创建一个三维数组,并为各维度命名
> array2<-array(c(1:24),dim=c(2,4,3),
+
dimnames = list(c('A1','A2'),c('B1','B2','B3','B4'),c('C1','C2','C3')))
> array2
, , C1
B1 B2 B3 B4
A1
1
3
5
7
A2
2
4
6
8
, , C2
B1 B2 B3 B4
A1
9 11 13 15
A2 10 12 14 16
, , C3
B1 B2 B3 B4
A1 17 19 21 23
A2 18 20 22 24
# 创建一个四维数组
> array3<-array(c(1:48),dim=c(3,4,2,2))
> array3
, , 1, 1
[,1] [,2] [,3] [,4]
[1,]
1
4
7
10
[2,]
2
5
8
11
[3,]
3
6
9
12
, , 2, 1
[,1] [,2] [,3] [,4]
[1,]
13
16
19
22
[2,]
14
17
20
23
[3,]
15
18
21
24
, , 1, 2
[,1] [,2] [,3] [,4]
[1,]
25
28
31
34
[2,]
26
29
32
35
[3,]
27
30
33
36
, , 2, 2
[,1] [,2] [,3] [,4]
[1,]
37
40
43
46
[2,]
38
41
44
47
[3,]
39
42
45
48

数据框

二维,可以包含不同数据类型。R中最常处理的数据结构。

通过data.frame()创建数据框:

# 创建一个数据框,包含三种数据类型
> name<-c('Amy','Ben','Cindy')
> age<-c(10,12,17)
> data<-c(T,F,T)
> df1<-data.frame(name,age,data)
> df1
name age
data
1
Amy
10
TRUE
2
Ben
12 FALSE
3 Cindy
17
TRUE

列表

列表是R中最灵活、最为复杂的一种数据结构。是一些对象的有序集合,对象可以是向量、矩阵、数组、数据框,甚至其他列表。

通过list()创建列表:

# 创建一个包含向量、矩阵、数组和数据框的列表
> list1<-list(v1,matrix3,array2,df1)
> list1
[[1]]
[1] 1 2 3 4 5 6
[[2]]
a b c
d
A 1 4 7 10
B 2 5 8 11
C 3 6 9 12
[[3]]
, , C1
B1 B2 B3 B4
A1
1
3
5
7
A2
2
4
6
8
, , C2
B1 B2 B3 B4
A1
9 11 13 15
A2 10 12 14 16
, , C3
B1 B2 B3 B4
A1 17 19 21 23
A2 18 20 22 24
[[4]]
name age
data
1
Amy
10
TRUE
2
Ben
12 FALSE
3 Cindy
17
TRUE
# 为列表中的各个对象命名
names(list1)<-c('A','B','C','D')

因子

变量和分为连续型、有序型和名义型。①连续型变量比如年龄,可以是10.5或14.3,同时表示了顺序和数量。②有序型变量比如成绩,可以是甲乙丙丁,只表示一种顺序关系,不代表数量关系。③名义型变量比如性别,是无序的,仅表示没有顺序之分的不同类别。

有序型变量和名义型变量在R中被称为因子。

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

通过factor()创建因子:

# 未给定顺序时结果如下,默认按字母顺序排序
> factor1<-factor(c('甲','乙','甲','丁','丙','乙'))
> factor1
[1] 甲 乙 甲 丁 丙 乙
Levels: 丙 丁 甲 乙
# 给定顺序时结果如下
> factor2<-factor(c('甲','乙','甲','丁','丙','乙'),order=T,
+
levels=c('甲','乙','丙','丁'))
> factor2
[1] 甲 乙 甲 丁 丙 乙
Levels: 甲 < 乙 < 丙 < 丁

数值型变量可以通过factor()转换成因子:

> sex<-c(1,2,1,1,2)
> sex<-factor(sex,levels=c(1,2),labels = c('Male','Female'))
> sex
[1] Male
Female Male
Male
Female
Levels: Male Female

调用

中括号[]和$是常见的调用数据结构中数值的方法。

其中向量、矩阵、数组只能用[]来进行调用,数据框和列表可以仅用[]进行调用,也可以结合[]和$调用。

向量

> vector1<-c(10:20)
> vector1[c(3,6,9)]
#
调用第3、6、9个元素
[1] 12 15 18
> vector1[c(3:6)]
#
调用第3到第6个元素
[1] 12 13 14 15
> vector1[c(T,F,T,F,T,F,T,F,T,F,T)]
#
调用逻辑值为TRUE的对应值
[1] 10 12 14 16 18 20
> vector1[c(T,F,F)]
#
即使逻辑值与元素个数不是一一对应也可以调用,逻辑似乎是多次重复向量
[1] 10 13 16 19
> vector1[-2]
#
方括号中也可以为负数,表示不调用第2个元素
[1] 10 12 13 14 15 16 17 18 19 20
> vector1[c(-1:-5)]
#
方括号中也可以为负数向量,表示不调用第1到第5个元素
[1] 15 16 17 18 19 20
> vector2<-c(1:5)
> names(vector2)<-c('A','B','C','D','E')
> vector2
A B C D E
1 2 3 4 5
> vector2['B']
#
调用名称为B的值
B
2 

矩阵

> matrix1<-matrix(c(1:12),3,4)
> matrix1
[,1] [,2] [,3] [,4]
[1,]
1
4
7
10
[2,]
2
5
8
11
[3,]
3
6
9
12
> matrix1[2, ]
#
调用第2行
[1]
2
5
8 11
> matrix1[ ,3]
#
调用第3列
[1] 7 8 9
> matrix1[2,4]
#
调用第2行第4列
[1] 11
> matrix1[c(1,3),4]
#
调用第1、3行第4列
[1] 10 12
> matrix2<-matrix(c(1:12),3,4,
+
dimnames = list(c('r1','r2','r3'),c('c1','c2','c3','c4')))
> matrix2
c1 c2 c3 c4
r1
1
4
7 10
r2
2
5
8 11
r3
3
6
9 12
> matrix2['r2',c(2:4)]
#
调用行名为r2,第2到4列的元素
c2 c3 c4
5
8 11 

数组

> array1<-array(c(1:24),dim=c(2,4,3))
> array1
, , 1
[,1] [,2] [,3] [,4]
[1,]
1
3
5
7
[2,]
2
4
6
8
, , 2
[,1] [,2] [,3] [,4]
[1,]
9
11
13
15
[2,]
10
12
14
16
, , 3
[,1] [,2] [,3] [,4]
[1,]
17
19
21
23
[2,]
18
20
22
24
> array1[2,,]
#
调用第1维序号为2的各元素
[,1] [,2] [,3]
[1,]
2
10
18
[2,]
4
12
20
[3,]
6
14
22
[4,]
8
16
24
> array1[,2,]
#
调用第2维序号为2的各元素
[,1] [,2] [,3]
[1,]
3
11
19
[2,]
4
12
20
> array1[,,2]
#
调用第3维序号为2的各元素
[,1] [,2] [,3] [,4]
[1,]
9
11
13
15
[2,]
10
12
14
16
> array1[1,,2]
#
调用第1维序号为1,并且第3维序号为2的各元素
[1]
9 11 13 15
# 也可以给数组各维度命名,调用方式与矩阵类似

数据框

> name<-c('Amy','Ben','Cindy')
> age<-c(10,12,17)
> data<-c(T,F,T)
> df1<-data.frame(name,age,data)
> df1
name age
data
1
Amy
10
TRUE
2
Ben
12 FALSE
3 Cindy
17
TRUE
> df1[1,]
#
调用第1行
name age data
1
Amy
10 TRUE
> df1[,1]
#
调用第1列
[1] "Amy"
"Ben"
"Cindy"
> df1[2,3]
#
调用第2行第3列
[1] FALSE
> df1[2,'name']
#
调用第2行列名为name的列
[1] "Ben"
> df1$name
#
调用列名为name的列
[1] "Amy"
"Ben"
"Cindy"
> df1$age[2]
#
调用列名为age的列中第2行
[1] 12

生成列联表方法如下:

> name<-c('Amy','Ben','Cindy','Diana','Erick','Ford')
> sex<-factor(c(1,2,1,1,2,2),levels = c(1,2),labels = c('Male','Female'))
> grade<-factor(c(1,3,2,1,2,1),levels = c(1,2,3),labels = c('甲','乙','丙'))
> studentdata<-data.frame(name,sex,grade)
> studentdata
name
sex grade
1
Amy
Male
甲
2
Ben Female
丙
3 Cindy
Male
乙
4 Diana
Male
甲
5 Erick Female
乙
6
Ford Female
甲
> table(studentdata$sex,studentdata$grade)
#
生成性别变量sex和成绩变量grade的列联表
甲 乙 丙
Male
2
1
0
Female
1
1
1

列表

> list1<-list(vector1,matrix1,array1,df1)
> names(list1)<-c('A','B','C','D')
> list1
$A
[1] 10 11 12 13 14 15 16 17 18 19 20
$B
[,1] [,2] [,3] [,4]
[1,]
1
4
7
10
[2,]
2
5
8
11
[3,]
3
6
9
12
$C
, , 1
[,1] [,2] [,3] [,4]
[1,]
1
3
5
7
[2,]
2
4
6
8
, , 2
[,1] [,2] [,3] [,4]
[1,]
9
11
13
15
[2,]
10
12
14
16
, , 3
[,1] [,2] [,3] [,4]
[1,]
17
19
21
23
[2,]
18
20
22
24
$D
name age
data
1
Amy
10
TRUE
2
Ben
12 FALSE
3 Cindy
17
TRUE
> list1[[1]]
#
引用list1中第1个对象
[1] 10 11 12 13 14 15 16 17 18 19 20
> list1[[1]][5]
#
引用list1中第1个对象的第5个元素
[1] 14
> list1[['D']]['name']
#
引用list1中名称为D,列名为name的对象
name
1
Amy
2
Ben
3 Cindy
> list1$B
#
引用list1中名称为B的对象
[,1] [,2] [,3] [,4]
[1,]
1
4
7
10
[2,]
2
5
8
11
[3,]
3
6
9
12
> list1$B[3,2]
#
引用list1中名称为B的对象的第3行第2列个元素
[1] 6

最后

以上就是活力镜子为你收集整理的R语言入门——数据类型和数据结构变量数据类型数据结构的全部内容,希望文章能够帮你解决R语言入门——数据类型和数据结构变量数据类型数据结构所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(40)

评论列表共有 0 条评论

立即
投稿
返回
顶部