数据结构

元素数据类型相同 元素数据类型不同
一维 向量(vector) 列表(list)
二维 矩阵(matrix) 数据框(dara frame)
N维 数组(array)

array可以是一维也可以是多维!

创建数组

  • array(data=NA,dim=length(data),dimnames=NULL)
  • data:用于创建数组的数据
  • dim:维度,例如c(3,4,2)
  • dimnames:传递一个列表,列表各个组件表示维度名字

数据索引

假设A是一个三维数组:
A[行索引,列索引,层索引]
假设A是一个四维数组:
A[行索引,列索引,层索引,立方体索引]

假设A是一个五维数组:
A[行索引,列索引,层索引,外层行,外层列]

三维:

> s<-array(sample(20:40,24,replace=T),
+          dim=c(3,4,2),
+          dimnames=list(paste0("型号",1:3), #行名
+                 c("32G","64G","128G","256G"), #列名
+                 c("A品牌","B品牌")) #层名
+          )
> s
, , A品牌32G 64G 128G 256G
型号1  28  27   37   38
型号2  24  31   27   31
型号3  24  34   35   30, , B品牌32G 64G 128G 256G
型号1  21  34   23   36
型号2  26  37   39   34
型号3  27  32   21   20> s[,,"B品牌"]32G 64G 128G 256G
型号1  21  34   23   36
型号2  26  37   39   34
型号3  27  32   21   20

四维:

> b<-array(1:120,dim=c(4,5,3,2)) #4行 5列 3层 2个
> b
, , 1, 1[,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, , 2, 1[,1] [,2] [,3] [,4] [,5]
[1,]   21   25   29   33   37
[2,]   22   26   30   34   38
[3,]   23   27   31   35   39
[4,]   24   28   32   36   40, , 3, 1[,1] [,2] [,3] [,4] [,5]
[1,]   41   45   49   53   57
[2,]   42   46   50   54   58
[3,]   43   47   51   55   59
[4,]   44   48   52   56   60, , 1, 2[,1] [,2] [,3] [,4] [,5]
[1,]   61   65   69   73   77
[2,]   62   66   70   74   78
[3,]   63   67   71   75   79
[4,]   64   68   72   76   80, , 2, 2[,1] [,2] [,3] [,4] [,5]
[1,]   81   85   89   93   97
[2,]   82   86   90   94   98
[3,]   83   87   91   95   99
[4,]   84   88   92   96  100, , 3, 2[,1] [,2] [,3] [,4] [,5]
[1,]  101  105  109  113  117
[2,]  102  106  110  114  118
[3,]  103  107  111  115  119
[4,]  104  108  112  116  120> #第2个立方体的第3层内部的第1行和第4行取2 3 4列
> b[c(1,4),2:4,3,2][,1] [,2] [,3]
[1,]  105  109  113
[2,]  108  112  116

列表

  • 创建列表:list(object1,object2,……)
  • 列表中各个组件的名称叫标签tags:list(tag1=obj1, tag2=obj2,……)
  • 使用names函数管理tags
    names(x) 获取tags
    names(x) <- c(……) 修改tags
    names(x) <- NULL 删除tags
> stu2 <- list(StuNO="201801002",Name="Lisa",Height=166,IsParty=F)
> stu2
$StuNO
[1] "201801002"$Name
[1] "Lisa"$Height
[1] 166$IsParty
[1] FALSE> stu2[[3]] #方括号
[1] 166> stu2$Name #井号$组件名
[1] "Lisa"
> stu2$Height
[1] 166
-----------------
> names(stu2)
[1] "StuNO"   "Name"    "Height"  "IsParty"
列表索引
  • 双层 [[ ]] 索引某组件
  • 组件名称索引
  • 单层 [ ] 求子列表
> y<-list(101:110,#向量
+         matrix(1:12,nrow=3),#矩阵
+         array(1:24,dim=c(3,4,2)),#三维数组
+         list("Lisa","Research",T,1998) #列表
+ )
============================
> y[[1]] #第一个组件[1] 101 102 103 104 105 106 107 108 109 110
> y[[1]][3:6] #第一个组件内部3-6
[1] 103 104 105 106
> y[[1]][c(2,5,8)] #第一个组件内部2 5 8
[1] 102 105 108
============================
> y[[2]][,1] [,2] [,3] [,4]
[1,]    1    4    7   10
[2,]    2    5    8   11
[3,]    3    6    9   12
> y[[2]][2,3] #第2个组件是一个矩阵,第2行第3列的元素
[1] 8
> y[[2]][c(1,3),] #矩阵内第1和第3行[,1] [,2] [,3] [,4]
[1,]    1    4    7   10
[2,]    3    6    9   12
============================
> y[[4]] #列表内部的列表
[[1]]
[1] "Lisa"[[2]]
[1] "Research"[[3]]
[1] TRUE[[4]]
[1] 1998> y[[4]][[1]] #内部列表的第1个组件
[1] "Lisa"

[ ] 和 [ [ ] ] 的区别:

> x
[[1]]
[1] 1 2 3 4 5[[2]][1] 11 12 13 14 15 16 17 18 19 20[[3]][1] 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45[[4]]
[1]  TRUE FALSE  TRUE  TRUE FALSE[[5]]
[1] "Tony" "Lisa" "Mary" "John"==========================
> x[2] #单层方括号是求子列表
[[1]][1] 11 12 13 14 15 16 17 18 19 20> x[[2]] #双层方括号获取某个组件[1] 11 12 13 14 15 16 17 18 19 20==============> class(x[[2]]) #integer 向量
[1] "integer"
> class(x[2]) #list 列表
[1] "list"

列表操作

  • 增加组件:x[[4]] <- c(2,3,5)person$weight <- 80
  • 删除组件:x[[3]] <- NULL
  • 修改组件: 类似于增加组件,组件名称是已存在的
''' 修改列表 '''
> s$Weight <- sample(45:80,12,replace=T)
''' 新增列表 '''
> s[[6]] <- sample(c("A","B","AB","O"),12,replace=T)
''' 删除列表组件 '''
> s$Weight <- NULL

相关函数:

  • unlist(x):列表转换为向量。如果列表内含有字符,则整个向量都是字符类型
  • unname(x):去掉R对象的name属性
> y<-unlist(x) #Flatten Lists
> y #字符串向量[1] "1"     "2"     "3"     "4"     "5"     "11"    "12"    "13"    "14"
[10] "15"    "16"    "17"    "18"    "19"    "20"    "31"    "32"    "33"
[19] "34"    "35"    "36"    "37"    "38"    "39"    "40"    "41"    "42"
[28] "43"    "44"    "45"    "TRUE"  "FALSE" "TRUE"  "TRUE"  "FALSE" "Tony"
[37] "Lisa"  "Mary"  "John"
> class(y) #character
[1] "character
  • c(list1, list2, list3,……):连接多个列表
    – 其中recursive默认值是 FALSE,TRUE表示得到一个向量
> x<-list(1:5,c("Tony","Mary","Victor"))
> y<-list(101:110,c("北京","上海","广州","深圳"))
> z<-c(x,y)
> z
[[1]]
[1] 1 2 3 4 5[[2]]
[1] "Tony"   "Mary"   "Victor"[[3]][1] 101 102 103 104 105 106 107 108 109 110[[4]]
[1] "北京" "上海" "广州" "深圳"> c(x,y,recursive=T) #字符串向量[1] "1"      "2"      "3"      "4"      "5"      "Tony"   "Mary"   "Victor"[9] "101"    "102"    "103"    "104"    "105"    "106"    "107"    "108"
[17] "109"    "110"    "北京"   "上海"   "广州"   "深圳"

数据框data frame

  • data.frame(name1=col1,name2=col2,...,stringsAsFactors=TRUE)
    – 默认情况下是字符串会被转换成因子

  • 读取csv文件创建数据框:read.csv(filename, fileEncoding= 'UTF-8')

> p<-read.csv("C:/person.csv",fileEncoding="GB18030")
> p学号   姓名   专业
1  201701001   张三 管理学
2  201701002   李斯 统计学
3  201701003    Tom 精算学
4  201701004   Tony 经济学
5  201701005   Lisa 金融学
6  201701006   Mary 统计学
7  201701007 Victor 统计学
8  201701008   吴大 管理学
9  201701009   王一 金融学
10 201701010   赵三 管理学
11 201701011   John 经济学
12 201701012   李丽 管理学
13 201701013   王华 精算学
14 201701014 钱多多 金融学
15 201701015   许多 金融学
16 201701016   毛毛 经济学
17 201701017   小花 精算学
18 201701018   艾艾 管理学
19 201701019   丽丽 金融学
20 201701020   美丽 经济学

查询数据框的结构和摘要

str(object):查看对象的结构【data.frame】

  • 类型是data.frame
  • 观测的数量,即行数;变量的数量,即列数
  • 每个变量(每列)显示的数据类型和部分数据
> str(p) #20 obs.(observations) of  3 variables
'data.frame': 20 obs. of  3 variables:$ 学号: int  201701001 201701002 201701003 201701004 201701005 201701006 201701007 201701008 201701009 201701010 ...$ 姓名: Factor w/ 20 levels "John","Lisa",..: 19 9 4 5 2 3 6 16 15 20 ...$ 专业: Factor w/ 5 levels "管理学","金融学",..: 1 5 4 3 2 5 5 1 2 1 ...

summary(object):获取对象的统计摘要

  • 数值型的列:最小值、最大值、均值、中位数等
  • 因子所在列:每个水平的个数
> #读取数据时避免字符串转成因子
> p<-read.csv("C:/person.csv",fileEncoding="GB18030", stringsAsFactors= FALSE)
> p$专业 <- factor(p$专业) #转成因子> str(p)
'data.frame': 20 obs. of  3 variables:$ 学号: int  201701001 201701002 201701003 201701004 201701005 201701006 201701007 201701008 201701009 201701010 ...$ 姓名: chr  "张三" "李斯" "Tom" "Tony" ...$ 专业: Factor w/ 5 levels "管理学","金融学",..: 1 5 4 3 2 5 5 1 2 1 ...> #给数据框增加一列
> p$成绩 <- pmin(round(rnorm(20,mean=78,sd=6.5)),100)> summary(p)学号               姓名               专业        成绩      Min.   :201701001   Length:20          管理学:5   Min.   :62.00  1st Qu.:201701006   Class :character   金融学:5   1st Qu.:72.00  Median :201701010   Mode  :character   经济学:4   Median :76.00  Mean   :201701010                      精算学:3   Mean   :76.20  3rd Qu.:201701015                      统计学:3   3rd Qu.:81.25  Max.   :201701020                                 Max.   :95.00
查看数据库的基本信息
  • head(x):查看数据库的前几行;默认前6行
  • tail(x):查看后几行;
  • nrow(x):获得数据框的行数;
  • ncol(x) 或者length(x):获取数据库的列数;
  • dim(x):获取数据库的行数和列数;
> head(person,n=10) #前10行学号   姓名   专业 成绩
1  201701001   张三 管理学   81
2  201701002   李斯 统计学   70
3  201701003    Tom 精算学   76
4  201701004   Tony 经济学   62
5  201701005   Lisa 金融学   83
6  201701006   Mary 统计学   63
7  201701007 Victor 统计学   74
8  201701008   吴大 管理学   79
9  201701009   王一 金融学   72
10 201701010   赵三 管理学   73
> dim(person) #行数和列数
[1] 20  4
> nrow(person) #行数
[1] 20
> ncol(person) #列数
[1] 4
  • colnames(x)或者names(x):管理列的名字;
  • rownames(x)或者row.names(x):管理行的名字
> colnames(person)
[1] "ID"    "Name"  "Major" "Score"
> colnames(person) <- c("ID","Name","Major","Score")
====================
> row.names(person)[1] "1"  "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9"  "10" "11" "12" "13" "14"
[15] "15" "16" "17" "18" "19" "20"> row.names(person)<-paste0("r",1:20)
> head(person)ID Name  Major Score
r1 201701001 张三 管理学    81
r2 201701002 李斯 统计学    70
r3 201701003  Tom 精算学    76
r4 201701004 Tony 经济学    62
r5 201701005 Lisa 金融学    83
r6 201701006 Mary 统计学    63
数据框索引–类似矩阵索引

按照矩阵形式索引

> person[5:9,2:3] #按照矩阵形式索引Name  Major
r5   Lisa 金融学
r6   Mary 统计学
r7 Victor 统计学
r8   吴大 管理学
r9   王一 金融学> person[5:9,c("Name","Major")]Name  Major
r5   Lisa 金融学
r6   Mary 统计学
r7 Victor 统计学
r8   吴大 管理学
r9   王一 金融学

逻辑值索引

> person[person$ID%%2==0,] #学号是偶数的行ID   Name  Major Score
r2  201701002   李斯 统计学    70
r4  201701004   Tony 经济学    62
r6  201701006   Mary 统计学    63
r8  201701008   吴大 管理学    79
r10 201701010   赵三 管理学    73
r12 201701012   李丽 管理学    72
r14 201701014 钱多多 金融学    83
r16 201701016   毛毛 经济学    79
r18 201701018   艾艾 管理学    83
r20 201701020   美丽 经济学    75
==================

也可以用这个方法

subset(person,ID%%2==0) #subset函数ID前无需数据框名

按照列表形式索引

> person[[1]][1] 201701001 201701002 201701003 201701004 201701005 201701006 201701007[8] 201701008 201701009 201701010 201701011 201701012 201701013 201701014
[15] 201701015 201701016 201701017 201701018 201701019 201701020> person$ID[1] 201701001 201701002 201701003 201701004 201701005 201701006 201701007[8] 201701008 201701009 201701010 201701011 201701012 201701013 201701014
[15] 201701015 201701016 201701017 201701018 201701019 201701020

数据框操作

  • 增加修改删除列与列表一样
> person$Height <- sample(155:185,20,replace=T)
> person$Weight <- sample(45:80,20,replace=T)
> head(person)ID Name  Major Score Height Weight
1 201701001 张三 管理学    81    172     58
2 201701002 李斯 统计学    70    171     45
3 201701003  Tom 精算学    76    163     52
4 201701004 Tony 经济学    62    170     52
5 201701005 Lisa 金融学    83    173     65
6 201701006 Mary 统计学    63    170     58
  • 增加行:rebind(person,other),其中other是数据框或者list
> person<-rbind(person,list(202001001,"若涵","金融学",86,52))
> tail(person,n=3)ID Name  Major Score Weight
19 201701019 丽丽 金融学    71     59
20 201701020 美丽 经济学    80     47
21 202001001 若涵 金融学    86     52
========================
> other<-data.frame(ID=c(202041002,202025007), Name=c("笑笑","吴双"), Major=c("统计学","经济学"),Score=c(92,96), Weight=c(60,78))
> otherID Name  Major Score Weight
1 202041002 笑笑 统计学    92     60
2 202025007 吴双 经济学    96     78> person<-rbind(person,other)
> tail(person,n=4)ID Name  Major Score Weight
20 201701020 美丽 经济学    80     47
21 202001001 若涵 金融学    86     52
22 202041002 笑笑 统计学    92     60
23 202025007 吴双 经济学    96     78

保存csv文件:
quote=F:字符就不会带有双引号

write.csv(person,file="C:\\student.csv",row.names=F,quote=F)

绑定数据框

  • attach(df):绑定数据框以后可以直接使用列名访问某一列。绑定过程中可能遇到列名或者全局变量名冲突的情况,此时冲突列绑定失败。
  • detach(df):解绑数据框,解绑以后无法只通过列名访问数据框
> colnames(person)
[1] "ID"     "Name"   "Major"  "Score"  "Weight"
> attach(person)
> fivenum(Score)
[1] 69.0 75.5 80.0 85.0 96.0
> summary(Weight)Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 46.00   55.50   64.00   62.78   69.00   79.00
> detach(person)
  • with(df,{ }):在花括号的语句可以直接使用列名访问数据框的各列,不会和全局变量冲突
> with(person,{fivenum(Score)})
[1] 69.0 75.5 80.0 85.0 96.0

或者

> with(person,{+   print(fivenum(Score))
+   print(summary(Weight))
+   print(table(Major))
+ })
[1] 69.0 75.5 80.0 85.0 96.0Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 46.00   55.50   64.00   62.78   69.00   79.00
Major
管理学 金融学 经济学 精算学 统计学 5      6      5      3      4

补充:使用R自带数据toothgrowth绘制箱型图

with(ToothGrowth, {boxplot(len ~ dose, boxwex = 0.25, at = 1:3 - 0.2,subset = (supp == "VC"), col = "yellow",main = "Guinea Pigs' Tooth Growth",xlab = "Vitamin C dose mg",ylab = "tooth length", ylim = c(0, 35))boxplot(len ~ dose, add = TRUE, boxwex = 0.25, at = 1:3 + 0.2,subset = supp == "OJ", col = "orange")legend(2, 9, c("Ascorbic acid", "Orange juice"),fill = c("yellow", "orange"))
})

R语言学习笔记(四)--数据结构相关推荐

  1. R语言学习笔记——高级篇:第十四章-主成分分析和因子分析

    R语言 R语言学习笔记--高级篇:第十四章-主成分分析和因子分析 文章目录 R语言 前言 一.R中的主成分和因子分析 二.主成分分析 2.1.判断主成分的个数 2.2.提取主成分 2.3.主成分旋转 ...

  2. R语言学习笔记(1~3)

    R语言学习笔记(1~3) 一.R语言介绍 x <- rnorm(5) 创建了一个名为x的向量对象,它包含5个来自标准正态分布的随机偏差. 1.1 注释 由符号#开头. #函数c()以向量的形式输 ...

  3. r语言c函数怎么用,R语言学习笔记——C#中如何使用R语言setwd()函数

    在R语言编译器中,设置当前工作文件夹可以用setwd()函数. > setwd("e://桌面//") > setwd("e:\桌面\") > ...

  4. R语言学习笔记——入门篇:第一章-R语言介绍

    R语言 R语言学习笔记--入门篇:第一章-R语言介绍 文章目录 R语言 一.R语言简介 1.1.R语言的应用方向 1.2.R语言的特点 二.R软件的安装 2.1.Windows/Mac 2.2.Lin ...

  5. R语言学习笔记——入门篇:第三章-图形初阶

    R语言 R语言学习笔记--入门篇:第三章-图形初阶 文章目录 R语言 一.使用图形 1.1.基础绘图函数:plot( ) 1.2.图形控制函数:dev( ) 补充--直方图函数:hist( ) 补充- ...

  6. R语言学习笔记 07 Probit、Logistic回归

    R语言学习笔记 文章目录 R语言学习笔记 probit回归 factor()和as.factor() relevel() 案例11.4复刻 glm函数 整理变量 回归:Logistic和Probit- ...

  7. R语言学习笔记 06 岭回归、lasso回归

    R语言学习笔记 文章目录 R语言学习笔记 比较lm.ridge和glmnet函数 画岭迹图 图6-4 <统计学习导论 基于R语言的应用>P182 图6-6<统计学习导论 基于R语言的 ...

  8. R语言学习笔记(八)--读写文件与网络爬虫

    R语言学习笔记(八) 1 工作路径 2 保存R对象 3 Scan函数 3-1 从控制台读取数据 3-2 从txt文件读取数据 3-3 从url读取数据 4 按行读写文本文件 5 读取文本文件(txt. ...

  9. R语言学习笔记(三)多元数据的数据特征、相关分析与图形表示

    文章目录 写在前面 独立性检验 χ2\chi^2χ2独立性检验 Fisher独立性检验 Cochran-Mantel-Haenszel χ2\chi^2χ2独立性检验 相关性分析 相关性检验 相关性检 ...

  10. R语言学习笔记--《R语言实战》

    文章目录 R语言基础 一.数据结构 1. 向量 2. 矩阵 3. 数组 4. 数据框 5.列表 二.数据输入 1.键盘输入 2.分隔符文本输入 (csv) 图形初阶 一.图形参数 1.符号和线条 2. ...

最新文章

  1. Ubuntu网络配置方法
  2. php判断当前时间是否跨月,判断日期是否能跨月查询的js代码_javascript技巧
  3. Myeclipse编辑器简单使用整理
  4. 华为服务器系统蓝屏,服务器主机蓝屏
  5. 运放放大倍数计算公式_19.运算放大器的特性与应用,不得不掌握的知识点(一)...
  6. OSPF外部路由汇总
  7. 用梯度下降求解最小二乘线性回归python实现
  8. 微信公众号教程(16)公司通讯录开发 终
  9. 单片机——电子密码锁设计报告
  10. opencv3/C++ 机器学习-EM算法/Expectation Maximization
  11. 矩阵分解 Cholesky分解
  12. 国产之光!Mac必备长截图软件!iShot 1.7.7中文版
  13. 用python编程小程序制作_一个非常适合Python新手的编程案例——投票小程序
  14. 1077E Thematic Contests 【二分答案】
  15. 教师计算机西沃培训心得,学习使用希沃电子白板的心得体会
  16. Redis学习笔记(B站狂神说)(自己总结方便复习)
  17. mysql 慢查询毫秒_Mysql 慢查询优化实践
  18. echarts地图学习(使用geoJson数据绘制地图)
  19. 关于虚拟机镜像无法检测
  20. mysql fieldtype_【原创】9. MYSQL++中的Field、FieldNames以及FieldTypes类型

热门文章

  1. arduino超声波测距接线图详细_Arduino Uno + HY-SRF05 超声波测距模块详细讲解演示实验...
  2. kotlin版贪吃蛇小游戏
  3. Horner method
  4. 洋酒销售系统的设计与实现(附源码+资料+论文+截图+数据库)
  5. 简单的交叉熵损失函数,你真的懂了吗?
  6. python储物柜难题_7个储物柜收纳小技巧,轻松解决你的收纳难题。
  7. 深入浅出matplotlib(9):知道两点坐标画直线
  8. 题解 UVA12304 【2D Geometry 110 in 1!】
  9. GIT之Rebase的使用
  10. 5.2为每种类型的模块内聚举一个例子