R:数据结构

1. 数据结构

1.1 数据结构概述

概念

数据结构是计算机存储、组织数据的方式

数据结构是指相互之间存在一种或多种特定关系的数据元素集合

R中常见的数据结构

  • 向量
  • 矩阵
  • 数据框:经常使用的一种数据结构
  • 列表
  • 因子

R中常见的数据结构

  • 数值型:数值可以用于直接结算,加减乘除
  • 字符串型:可以进行连接,转换,提取等
  • 逻辑型:真或者假
  • 日期型

1.2 向量

向量概述

向量是R语言中最基本的数据结构,向量必须由类型相同的元素组成

使用赋值符号“<-”和组合函数c(),可以创建各种类型的向量

> x<-c(1,2,3,4,5)
> x
[1] 1 2 3 4 5
> y <- c("one","two","there")
> y
[1] "one"   "two"   "there"
> z <- c(TRUE,FALSE,T,F)
> z
[1]  TRUE FALSE  TRUE FALSE

建立特殊的向量

> c(1:10)
 [1]  1  2  3  4  5  6  7  8  9 10

> seq(from=1,to=10)
 [1]  1  2  3  4  5  6  7  8  9 10
# from为起始值,to为终止值,by控制步幅
> seq(from=1,to=10,by=2)
 [1] 1 3 5 7 9
# length.out控制个数
> seq(from=1,to=10,length.out = 3)
 [1]  1.0  5.5 10.0
> seq(from=1,to=10,length.out = 3)
 [1]  1.0  5.5 10.0

> rep(2,5)
 [1] 2 2 2 2 2
# 一共重复5次
> rep(c(1,2,3),5)
 [1] 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3
# 每个重复5次
> rep(c(1,2,3),each=5)
 [1] 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3
# 每个重复3次,且总体重复2次
> rep(c(1,2,3),each=3,times=2)
 [1] 1 1 1 2 2 2 3 3 3 1 1 1 2 2 2 3 3 3

访问向量

  1. 通过数字索引进行访问
> x <- c(1:10)
> x
 [1]  1  2  3  4  5  6  7  8  9 10
# R语言中的索引位置从1开始
> x[1]
 [1] 1
# 可以一次用向量索引多个元素
> x[c(1,3,5)]
 [1] 1 3 5
# 索引负元素指显示除负元素以外的所有元素
> x[-4]
 [1]  1  2  3  5  6  7  8  9 10
  1. 通过表达式进行访问
> x <- c(1:10)
# 输出大于4的数
> x[x>4]
 [1]  5  6  7  8  9 10
# 输出大于4小于8的数
> x[x>4 & x<8]
 [1] 5 6 7
# 判断1是否在x中
> 1 %in% x
 [1] TRUE
# 将x中的数据定义为TRUE,并输出为TRUE的元素
> x[1 %in% x]
 [1]  1  2  3  4  5  6  7  8  9 10
  1. 通过索引名进行访问
> x <- c(1:10)
> names(x) <- c("一","二","三","四","五","六","七","八","九","十")
> x["三"]
三 
 3 
> x
一 二 三 四 五 六 七 八 九 十 
 1  2  3  4  5  6  7  8  9 10 

向量运算

  1. 向量与数值的加减乘除

    > x <- 1:10
    # 对向量的运算都是对所有元素的操作
    > x + 2
     [1]  3  4  5  6  7  8  9 10 11 12
    > x - 3
     [1] -2 -1  0  1  2  3  4  5  6  7
    > x <- x + 1
    > x
     [1]  2  3  4  5  6  7  8  9 10 11
    # **是幂次运算
    > x ** 2
     [1]   4   9  16  25  36  49  64  81 100 121
    # %%是求余数
    > x %% 2
     [1] 0 1 0 1 0 1 0 1 0 1
    # %/%是整除运算
    > x %/% 2
     [1] 1 1 2 2 3 3 4 4 5 5
    
  1. 向量与向量的加减乘除

    > x <- 1:10
    > y <- seq(1,100,length.out = 10)
    > x + y
     [1]   2  14  26  38  50  62  74  86  98 110
    > x * y
     [1]    1   24   69  136  225  336  469  624  801 1000
    > x ** y
     [1]  1.000000e+00  4.096000e+03  9.414318e+10
     [4]  2.951479e+20  2.842171e+31  3.771117e+43
     [7]  4.183778e+56  2.760699e+70  8.464150e+84
    [10] 1.000000e+100
    > x %% y
     [1]  0  2  3  4  5  6  7  8  9 10
    > x %/% y
     [1] 1 0 0 0 0 0 0 0 0 0
    #向量运算长的必须是短的元素的整数倍,可以进行循环
    
  2. 数学函数

    • abs:返回每个向量的绝对值
    • sqrt:计算平方根
    • log、log10:计算对数
    • exp:计算指数
    • ceiling:返回不小于向量的最小整数
    • floor:返回不大于向量的最大整数
    • trunc:返回整数部分
    • round:进行四舍五入
  3. 统计函数

    • sum:向量所有元素之和
    • max:向量元素最大值
    • min:向量元素最小值
    • range:向量元素最大和最小值
    • mean:向量均值
    • var:向量方差
    • sd:向量标准差
    • prod:向量连乘积
    • median:向量中位数
    • quantile:向量分位数
    • which.min:最大值的索引值,还可以与其它统计函数结合

1.3 矩阵

矩阵的创建

矩阵的创建使用函数matrix(),元素数要超过行数与列数的乘积,可以只指定行数或列数

默认情况下按照列排序,可使用关键字byrow改为按行排序

> x <- matrix(1:20,nrow = 4,ncol = 5,byrow = T)
> x
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    2    3    4    5
[2,]    6    7    8    9   10
[3,]   11   12   13   14   15
[4,]   16   17   18   19   20

给矩阵的行与列命名

可以通过dimnames()函数给矩阵的行或列命名,命名后可以根据名字进行索引

还可以通过dim()函数创建矩阵

# 方式一:dimnames()
> x <- matrix(1:20,nrow = 4,ncol = 5,byrow = T)
> rnames <- c("R1","R2","R3","R4")
> cnames <- c("C1","C2","C3","C4","C5")
> dimnames(x) <- list(rnames,cnames)
> x
   C1 C2 C3 C4 C5
R1  1  5  9 13 17
R2  2  6 10 14 18
R3  3  7 11 15 19
R4  4  8 12 16 20

# 方式二:dim()
> dim(x) <- c(4,5)
> x
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    5    9   13   17
[2,]    2    6   10   14   18
[3,]    3    7   11   15   19
[4,]    4    8   12   16   20

1.4 数组

数组的创建

创建数组有两种方式:一是通过函数dim()创建

二是通过array()函数创建,同时可以指定索引名

# 方式一:dim()
> x <- 1:8
> dim(x) <- c(2,2,2)
> x
, , 1

     [,1] [,2]
[1,]    1    3
[2,]    2    4

, , 2

     [,1] [,2]
[1,]    5    7
[2,]    6    8

# 方式二:array()
> dim1 <- c("A1","A2")
> dim2 <- c("B1","B2")
> dim3 <- c("C1","C2")
> z <- array(1:8,c(2,2,2),dimnames = list(dim1,dim2,dim3))
> z
, , C1

   B1 B2
A1  1  3
A2  2  4

, , C2

   B1 B2
A1  5  7
A2  6  8

1.5 列表

列表顾名思义就是用来存储很多内容的一个集合,在其他编程语言中,列表一般和数组是等同的,但是在R语言中,列表却是R中最复杂的一种数据结构,也是非常重要的一种数据结构。

列表就是一些对象的有序集合。列表中可以存储若干向量、矩阵、数据框,甚至其他列表的组合。

列表的创建

创建一个列表使用函数list(),将列表元素添加其中,并且可以为列表元素命名

> a <- 1:10
> b <- "hello world"
> c <- matrix(1:12,nrow = 3,ncol = 4)
> mlist <- list(a,b,c)
> mlist
[[1]]
 [1]  1  2  3  4  5  6  7  8  9 10

[[2]]
[1] "hello world"

[[3]]
     [,1] [,2] [,3] [,4]
[1,]    1    4    7   10
[2,]    2    5    8   11
[3,]    3    6    9   12

> mlist <- list(first=a,second=b,third=c)
> mlist
$first
 [1]  1  2  3  4  5  6  7  8  9 10

$second
[1] "hello world"

$third
     [,1] [,2] [,3] [,4]
[1,]    1    4    7   10
[2,]    2    5    8   11
[3,]    3    6    9   12

列表的索引

# 通过数值进行索引
> mlist[1]
$first
 [1]  1  2  3  4  5  6  7  8  9 10

# 可以一次索引多个向量
> mlist[c(1,2)]
$first
 [1]  1  2  3  4  5  6  7  8  9 10
$second
[1] "hello world"

# 可以通过名称进行索引
> mlist["first"]
$first
 [1]  1  2  3  4  5  6  7  8  9 10

# 使用两个中括号进行索引时,代表是被索引元素的数据类型,而不是列表类型
> mlist[[1]]
 [1]  1  2  3  4  5  6  7  8  9 10

1.6 数据框

数据框是R语言中应用最广泛的数据结构

利用数据框,可以容纳不同类型的数据,而不必使用同一类型的数据

数据框的每一列的数据类型必须相同,但不同的列可以存储不同的类型的数据

数据框的创建

> a <- c("北京","上海","广州")
> b <- c("100平","125平","126平")
> c <- c("100万","150万","200万")
# 使用data.frame将已经建立好的向量作为参数传入其中
> d <- data.frame(a,b,c)
> d
     a     b     c
1 北京 100平 100万
2 上海 125平 150万
3 广州 126平 200万

数据框的访问

> d[1]
     a
1 北京
2 上海
3 广州
> d[c(1,3)]
     a     c
1 北京 100万
2 上海 150万
3 广州 200万

1.6 因子

因子是R语言中非常重要的的对象,或者说向量对象

因子主要用于管理离散的分类变量,比如成绩评定等级(A、B、C),颜色的分类(红、黄、蓝)

因子对象就是管理这些类别变量的重要工具

因子的创建

> grade <- c("A","B","B","A","C")
> gradef <- factor(grade)
# levels是因子的一个重要属性,揭示了因子中的类别
> gradef
[1] A B B A C
Levels: A B C
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342