生信技能树直播回放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.