R基础-2

2023-03-13 13:54:58 浏览数 (1)

生信技能树直播回放D2

1  多个数据如何组织?

批量的数据如何组织?了解数据结构的概念

1.1    数据结构包括四类:向量,数据框,矩阵,列表

      注意:

    (1)数据框约等于”表格“,不是完全等于表格。因为数据框不是电脑上的一个文件,并且要求每一列只能有一种数据类型。但是数据框可以导出,可以导出为一个表格。

    (2)数据框单独拿出的一列是向量(也是一串同一个类型的数据),视为一个整体

    (3)一个向量只能有一种数据类型,可以有重复值。

1.2  向量及后续  使用已准备好的Rproject(钉钉群里的R_01文件)

脚本打开是乱码的解决方式

2 向量

2.1  向量的生成(向量是一串同一种数据类型组合成的整体)

有4种办法

(1)用c()逐一放到一起   【 虽然只有一个字母,但是这也是个函数c】

代码语言:javascript复制
>c(2,5,6,2,9)
>c("a","f","md","b")   #字符型的数据用c组合的时候每个数据都要用引号"",要不然会找不到对象。

(2)连续的数字用冒号

代码语言:javascript复制
>1:5        #输出的结果是   1 2 3 4 5

(3)有重复的用rep(),有规律的序列用seq(),随机数用rnorm    【随机数函数可以用来编数据练习】

代码语言:javascript复制
>rep("x",times=3)   #输出的结果是 "x""x""x"
>seq(from=3,to=21,by=3)   #输出的结果是:3,6,9,12,15,18,21
>rnorm(n=3)               #输出3个随机数

(4)通过组合,产生更为复杂的向量【上难度了】

代码语言:javascript复制
>paste0(rep("x",times=3),1:3)  #输出的结果是:"x1""x2""x3"
[拆解上面的函数] x x x ,1 2 3
paste0做了个连接的事情,相同位置连接在一起,0表示是无缝连接。

练习题

代码语言:javascript复制
1 #生成1到15之间所有偶数
>seq(from=2,to=15,by=2)   [100分]
2 #生成向量,内容为:"student2" "student4" "student6" "student8" "student10""student12""student14"
提示paste
>paste0(rep("student",times=7),seq(from=2,to=15,by=2) )   [100分]
【一个简单的方法】times等于多少怎么来的?不能总用手指头数,见下面分解!
3 #将两种不同类型的数据用c()组合在一起,看输出结果  【看下面的tips】

一个tips:数据类型转换的优先顺序

先看一个例子。

代码语言:javascript复制
>c(1,"a")   输出的结果是:"1""a"
【数值型和字符型放在一起,会默认把数值型转换成字符型】
>c(TURE,"a")  输出的结果是:"TURE""a"
【逻辑型和字符型放在一起,会默认把逻辑型转换成字符型】
>c(TURE,FALSE,4)   输出的结果是:1 0 4
【逻辑型和数值型放在一起,会默认把逻辑型转换成数值型】

2.2  对单个向量进行的操作

(1)赋值【标准的符号是:<-      随意的符号是:=       还有一个快捷键是alt加减号】

代码语言:javascript复制
>x <- c(1,3,5,1)   #规范的赋值符号
>   
>x    这个输出的结果是:1,3,5,1
[运行完第一行代码就出现了一个大于号。直接运行x就行了]
代码语言:javascript复制
>x = c(1,3,5,1)  #这个是随意的写法
代码语言:javascript复制
#赋值和输出一起实现 
【第一种方法,加个括号】
>(x=c(1,3,5,1))
【第二种方法,把两句代码写在同一行上,两句代码中间用分号隔开,这个方法更加常用】
>x=c(1,3,5,1);x

关于变量名称的规则:变量名称简单点比较好

可以使用的名字:字母(c不行,因为c是一个函数)、英语单词(函数名字不可以用)、字母和数字组合(但是必须是字母在前面开头)、下划线可以用

不可以使用的名字:变量命名里面带空格不能用(可以用下划线替代空格和中划线)、中文名不能用

(2)简单数学计算

代码语言:javascript复制
>x=c(1,3,5,1)
>x 1

(3)根据某条件进行判断,生成逻辑值向量

代码语言:javascript复制
>x>3   可以自己输以下试试
>x==3
【==:这个返回的结果是FALSE 或者 TURE】

(4)初级统计

max(x)   #最大值

min(x)    #最小值

mean(x)   #均值

median(x)   #中位数

var(x)    #方差

sd(x)    #标准差

sum(x)   #总和

代码语言:javascript复制
>x=c(1,3,5,1)
>length(x)              【#长度】
代码语言:javascript复制
>x=c(1,3,5,1)
>unique(x)   【 #去重复  第一次出现不叫重复】
代码语言:javascript复制
>x=c(1,3,5,1)
>duplicated(x)  【 #判断下元素中有没有重复,第一次出现算没重复】
【如果想反过来,就用!这个非常重要,需要记住】
代码语言:javascript复制
>x=c(1,3,5,1)
>table(x)  【 #重复值统计】
代码语言:javascript复制
>x=c(1,3,5,1)
>sort(x)  【#排序,R语言按照自己的想法排,那么怎么看R语言自己的想法呢?答:用问号加函数名 ?sort 查看帮助文档】
【查看完帮助文档后,可以自己改默认值,但是要在作者允许的范围内】
>sort(x,decreasing = F)
>sort(x,decreasing = T)

可以在call back上面的练习题,times等于几的问题?

代码语言:javascript复制
>a=seq(from=2,to=15,by=2)
>paste0(rep("student",times=length(a)),seq(from=2,to=15,by=2) )

R语言里函数思想:能用函数代替,就不要手动去数,除非这代码只用一次

2.3  对两个向量的操作【对于两个向量的操作,不一样的长度时,会发生循环补齐,下面的(1、2、3)】

(1)比较运算,生成等长的逻辑向量

代码语言:javascript复制
>x=c(1,3,5,1)
>y=c(3,2,5,6)
>x==y
【结果会产生4个逻辑值】

(2) 数学计算

代码语言:javascript复制
>x y   【这个是等位运算】

(3)连接

代码语言:javascript复制
>paste(x,y,sep=",")  【以逗号为分割符号】
【paste和paste0的区别:paste有个空格。paste有个默认参数sep,默认sep" ",而paste0没有这个默认参数】

当两个向量长度不一致时【发生循环补齐】

代码语言:javascript复制
>x=c(1,3,5,6,2)
>y=c(3,2,5)
>x==y

利用循环补齐简化代码

代码语言:javascript复制
>paste0(rep("x",3),1:3)
可以简化成
>paste0("x",1:3)   【x可以看作是长度为1个向量】

(4)交集、并集、差集【这个一带而过,用的时候自行百度】

代码语言:javascript复制
>x=c(1,3,5,1)
>y=c(3,2,5,6)

重点:%in%(没有快捷键)

代码语言:javascript复制
>x=c(1,3,5,1)
>y=c(3,2,5,6)
>x%in%y   #x的每个元素在y中存在吗?返回的是逻辑值。

xy  和  x %in%y 的区别:xy是一个等位运算,更加严格

2.4  向量筛选(取子集)   中括号      有两种方式

2.4.1    [ ] :将TRUE对应的值挑出来,FALSE丢弃

一个思考:怎么从13个数字里挑出来大于7的?13个数字组成向量,赋值给x,x>7。

代码语言:javascript复制
比如:下面这些都是根据逻辑值对向量取子集的做法
(1)x<—— 8:12
    x==10     #逻辑值向量
    x[x==10]    #挑选出来x向量中,等于10的那些元素
(2)x<—— 8:12
     x<12
     x[x<12]

2.4.2   取x向量中的对应下表的那些元素    (根据位置筛选)

代码语言:javascript复制
比如
x<—— 8:12
x[4]    #输出的结果是11
x[2:4]   #输出的结果是9 10 11
x[c(1,5)]   #输出的结果是8  12    取好几个就把他组成一个向量
x[-4]   #反选的意思,只在数值中有意义。去掉第4个数字
x[-(2:4)]

【总结取子集的知识点】

根据逻辑值:中括号里是与x等长且一一对应的逻辑值向量

根据位置:中括号里是由x的下标组成的向量

代码语言:javascript复制
#思考:从13个彩色的球中,选出属于蓝色和绿色的?
#思路:13个球的颜色赋值给向量x,"蓝色"和"绿色"赋值给y。用逻辑值来实现。x%in%y
x[x %in% y]

2.5 如何修改向量中的某个/某些元素?

代码语言:javascript复制
>x == 8:12
>x[4] == 40  #改一个元素
>x
>x[c(1,5)] == c(80,20)  #改多个元素

R语言里的修改,都要赋值,没有赋值就没有发生过

2.6 简单的向量作图

代码语言:javascript复制
>k1=rnorm(12);k1    #把两句代码写在同一行上,两句代码中间用分号隔开
>k2=rep(c("a","b","c","d"),each=3);k2    
>plot(k1) #作图
>boxplot(k1~k2)

2.7 奥数题思考:如何调整元素顺序?

代码语言:javascript复制
>x=c("a","b","c","d","e");x
>x[c(2,4,5,1,3)]

sort函数 排序

代码语言:javascript复制
>scores=c(100,59,73,95,45);scores
>sort(scores)  
思考?用向量取子集的方式,怎么得到相同的结果?scores[?,?,?,?,?]
>scores[c(5,2,3,4,1)]

sort(x)  等于 x[order(x)]  ,x[order(x)]中的order(x)是一组下标,可以给x使用,也可以给x对应的其他向量使用.这个很有用,比如可以y[order(x)]  ,也就是order(x)的结果给y使用.起到移花接木的效果

order有什么用?

代码语言:javascript复制
>scores=c(100,59,73,95,45) 
#scores依次属于以下几个小朋友.默认就是一一对应了.kids和scores是对应的.
>kids=c("jimmy","nicker","Damon","Sophie","tony") 
#思考:如何按照分数从低到高给小朋友的名字排序? 可以理解为如何给排序后的分数 sort(scores)找到对应的小朋友?
>kids[order(scores)]  #也就是order(scores)的结果给了kids.

0 人点赞