学习小组Day5笔记-- 乳酸君

今天主要学习两个数据类型:向量和数据框。下面也只是展现了最基础的操作,以后将在学习的过程中慢慢补充。


Day5 向量与数据框

向量

  • 向量的概念
    在R语言当中,元素指代的是字符串、数字等数据类型,可分为标量向量向量提示我们它是有方向的,我们可以简单地将它定义为一排有序排列的元素。而标量则可以简单地理解为一个元素所组成的变量。

  • 向量的创建
    我们可以通过如下的方式创建一个新的向量:

冒号:用于创建某个数到另一个数的序列,默认间隔为1;
c():用来拼接数值和向量;
vector():创建一个指定长度和类型的矢量,其中的结果可为0,FALSE,空字符串或是NULL,格式为vector("数据类型",长度)
创建指定类型的空矢量:等同于上面的vector:
numeric(长度):创建指定长度的0
complex(长度):创建指定长度的0+0i
logical(长度):创建指定长度的FALSE
character(长度):创建指定长度的空字符串

  • 向量的序列
    除了上述的方式外,我们还可以通过如下方式创建更为通用的序列:

seq():可以创建从一个数到另一个数的序列,可指定步长,格式为seq(开始,结束,by= 步长 )
seq.int:与冒号类似创建一个从某个数到另一个数的序列,可指定步长,格式为seq.int(开始,结束,步长)
seq_len:创建一个从1开始到输入值的序列,格式为seq_len(输入值)
seq_along:创建一个从1开始,长度为输入值的序列,也就是说我们不必知道一个向量当中究竟有多少个元素,我们可以用此函数直接进行展示

> seq(1,5,by=2)
[1] 1 3 5
> seq.int(3,12,2)
[1]  3  5  7  9 11
> seq_len(8)
[1] 1 2 3 4 5 6 7 8
> x<-c(red=1,yellow=3,blue=5,green=7)
> seq_along(x)
[1] 1 2 3 4
  • 向量的长度
    所有的向量都有一个长度,用来表示这个向量包含多少个元素,我们可以用length()函数进行查看。

注意:
缺失值(NA)也会被计算在长度当中;
字符串向量使用length()时计算的是字符串的数目,而非每个字符串中字符串的长度。换句话说,统计的是有几个单词,而不是有有几个字母。如果想计算字母的个数,我们可以使用nchar()函数

  • 向量的索引
    索引(也被成为子集、下标、切片等),指代的是我们寻找向量中的某一部分或者部分元素的过程,通常通过中括号[]来实现。我们可以在中括号中加入以下的内容:

正数:会从第一个元素开始计数,返回此位置上的向量元素;
如果[]的数字多于一个,我们要写成如x[c(1,3,5)]这样的格式,也可以应用之前学过的冒号,写出x[c(2:4)]这样的索引;
负数:会返回除了处于这些位置上的向量元素;
逻辑向量:会返回逻辑结果为TRUE的向量元素;
向量的名字:如果我们给向量中的每个元素进行了命名,将会返回包含这些名字的向量元素

 在使用[]进行索引的过程中,也有一些需要注意的地方,包括:

① 不能混合使用正数和负数
② 在[]中输入正数和逻辑值时也可以加上缺失值NA,得到的对应值也为缺失值。但是如果我们事先输入了负数,则[]中不允许出现缺失值NA;
③ []中出现超出矢量的长度的数值会返回缺失值NA;
④ 输入非整数,[]中的数值将自动向零舍入;
⑤ []中什么也不输入将返回整个向量

> x<-c(red=1,yellow=3,blue=5,green=7)
> x
   red yellow   blue  green 
     1      3      5      7 
> x[3]
blue 
   5 
> x[-3]
   red yellow  green 
     1      3      7 
> x["red"]
red 
  1 

 除了中括号,我们还可以使用which()命令进行索引,它将返回逻辑向量中结果为TRUE  的元素。which.max()which.min()命令则返回向量中数值最大或者最小的那个元素:

> a<-1:10
> which(a>5)
[1]  6  7  8  9 10
> which.max(a)
[1] 10
> which.min(a)
[1] 1
  • 向量的重复
    如果需要将一段向量进行重复的书写,可以用到rep(要重复的向量,重复几次)函数,它的相关参数记录如下:

each=:每个元素均重复几次;
times=:每个元素分别重复几次;
length.out=:最终输出结果的长度

> rep(1:5,3)
 [1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5
> rep(1:5,each=3)
 [1] 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5
> rep(1:5,times=1:5)
 [1] 1 2 2 3 3 3 4 4 4 4 5 5 5 5 5
> rep(1:5,length.out=7)
[1] 1 2 3 4 5 1 2

数据框

  • 数据框的概念
    在R语言中,除了向量以外还有很多看起来很像表格的数据格式,包括:
    数组
    矩阵
    列表
    数据框
    元素类型角度:我们可以简单地理解为数组和矩阵需要当中的元素是同一类型的,比如都是数字;列表和数据框更接近我们实际当中的表格,可以包含不同的数据类型,就像我们可以在每一列当中分别写出姓名(字符串)、年龄(整数)、是否患病(逻辑)等。
    维度的角度数组和列表更复杂,可以进行更多维度的嵌套,而矩阵和数据框就像是我们平时在纸上画的那种简单的表格一样。
    (当然,它们还有一些其他微妙的区别,以上只是自己比较笼统的概述。)

所以我们可以简单地将数据框看为是一种可以储存不同数据类型的矩阵,或是非嵌套的列表,其中每个元素具有相同的长度。

  • 数据框的创建
    一般我们都是从外部直接导入,很少直接自己在R语言中创建。创建的函数为data.frame()。虽然每一列之间的数据类型可以不同,但是同一列的元素类型必须相同,下面是一个简单的例子:
> data_frame1<-data.frame(
+   x=letters[1:5],
+   y=rnorm(5),
+   z=runif(5)>0.5
+ )
> data_frame1
  x          y     z
1 a -0.5983922  TRUE
2 b  1.5111653 FALSE
3 c -0.1976543  TRUE
4 d  0.1837754  TRUE
5 e -0.6396710 FALSE
> class(data_frame1)
[1] "data.frame"

 其中列表为赋值时所给的x,y,z,而行名默认为数字从1开始排序。我们可以通过row.names=这个参数对行名进行更改。

  • 数据框的导入
    有很多格式和文本类型的标准可用于存储数据,如何将它们导入到R语言当中变成R语言认识的格式,是进行数据分析的第一步。
    对于类似电子表格的数据通常存储在逗号分隔值(CSV)制表符分隔文件之中,我们可以用read.table()进行读取,并将结果存储在数据框中。
    而还有一些其他使用起来比较方便的read.table()的亲戚,比如read.csv(),它使用逗号作为小数位,并假定该数据有标题行。
    其中一些常用的参数包括:

header=TRUE:将第一行作为标题行;
sep=‘某字符’:决定了使用哪个字符作为字段之间的分隔符,例如,sep='\t'则使用制表符作为分隔符;
fill=TRUE:将用NA代替缺失的部分;
nrow:指定读取数据的行数;
skip:决定跳过文件开始的多少行

> huahua<-read.table(file = "huahua.txt",sep = '\t',header = T)
> huahua
  X1 X2
1  A  1
2  B NA
3  C NA
4  D  3
5  E NA
> doudou<-read.csv("doudou.txt")
> doudou
  X1 X2
1  A  1
2  B NA
3  C NA
4  D  3
5  E NA
  • 数据框的行和列
    为了了解我们得到的数据,我们首先要知道数据框当中的每一行和每一列都表示什么信息,我们可以用下面的函数来查看行名和列名:
> rownames(huahua) #查看行名
[1] "1" "2" "3" "4" "5"
> colnames(huahua) #查看列名
[1] "X1" "X2"
> dimnames(huahua) #查看行名和列名
[[1]]
[1] "1" "2" "3" "4" "5"

[[2]]
[1] "X1" "X2"

 同样,我们还可以用上面的例子来进行行名列名的更改:

> colnames(huahua)[1]<-"bioplanet" #将第一列列名更改为bioplanet
> huahua
  bioplanet X2
1         A  1
2         B NA
3         C NA
4         D  3
5         E NA

 此外,为了了解数据的结构,我们还可以用下面的命令了解行数、列数:

> nrow(huahua) #看数据库有多少行
[1] 5
> ncol(huahua) #看数据库有多少列
[1] 2
> dim(huahua) #看数据库几行几列
[1] 5 2
  • 数据框的导出
    对数据框进行处理后,我们可以用下面的方式进行导出,其中最常用的函数为write.table(),我们首先给出要导出哪一个数据框(huahua),再对导出的文件进行命名(day5.txt),sep参数更改分隔符为逗号,quote=F则取消字符串的双引号。我们首先按照下面命令进行运行:
> write.table(huahua,file="day5.txt",sep = ',',quote = F)

 运行后,我们发现工作目录中多出了一个名为day5的txt文件:

导出数据框的结果
  • 数据框的索引
    与矩阵的索引类似,数据框中也可以使用4种不同的向量索引(正整数、负整数、逻辑值和字符),在中括号[]中,[x,y]表示x行y列,下面的例子对这种索引方式进行了具体的阐释:
> huahua[1,2]
[1] 1
> huahua[1,]
  bioplanet X2
1         A  1
> huahua[,2]
[1]  1 NA NA  3 NA
> huahua[,"X2"]
[1]  1 NA NA  3 NA
> huahua["X2"]
  X2
1  1
2 NA
3 NA
4  3
5 NA
> huahua[c(2,4),2]
[1] NA  3

 如果只选择单列的话,还可以使用美元符号$或者带有名称或正整数的双方括号[[]]:

> huahua$X2
[1]  1 NA NA  3 NA
> huahua[["bioplanet"]][2:3]
[1] B C
Levels: A B C D E

 如果想要使用逻辑向量,我们可以可以用sebset函数非常简洁地给列加上条件筛选出来我们所需要的的那些列。subset()共需要三个参数:一个数据框、一个行的逻辑条件、保留哪一列的名字(若省略则保留所有列):

> head(huahua)
  bioplanet X2
1         A  1
2         B NA
3         C NA
4         D  3
5         E NA
> subset(huahua,X2>0,bioplanet)
  bioplanet
1         A
4         D

反复使用数据框名的小技巧

在下面的例子中,我们反复使用到了数据框a这个变量。如果数据库名字比较长,则会显得很繁琐,这时,我们可以有一些小技巧来解决这个问题:

options(stringsAsFactors = T)
a <-data.frame(case=paste0("S",1:9),values=runif(9))
plot(a$case,a$values)
  • attach
    我们首先可以利用attach()命令在搜索环境中添加数据框a,这样便可以不用再下一次使用a的时候再打出数据框的名字了。但是使用完成后务必记得用detach命令退出,否则在有重名的变量、数据框时会很容易造成麻烦。
attach(a) #将数据框a添加到搜索环境中,以后我们再用a的时候不用再打它的全名了
plot(case,values)
detach(a)
  • with
    with函数也可以对需要反复输入的数据框变量名进行简化,它接受一个数据框和要计算的表达式作为输入参数:
with(a,{              #{}外面的a指明在哪个数据框当中进行操作
 plot(case,values)    #大括号里面的plot()的变量没有再使用a这个数据框名
x<<-summary(values)   #求和并赋值给x,<<的意思是作为全局变量,也就是出了大括号仍有效。
})

变量的保存

如果有时候我们尚未完成工作,需要暂时保存一部分变量或者脚本,我们可以采用下面的方法。注意变量名的书写,否则会找不到目标的对象:

> save.image(file="bioinfoplanet.RData") #保存当前所有变量
> save(huahua,file="test.RData") #保存其中一个变量

而再次用到这些的时候,我们只需要输入下面的命令就可以了:

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