R语言入门——数据类型与向量
一、class(x)判断数据类型(如:
1、字符型要加引号)
2、R语言三种数据类型
二、判断数据类型,使用is函数,返回T/F
is.numeric(x)
is.logical(x)
is.character(x)
三、数据类型转换,使用as函数
is.numeric(x)
is.logical(x)
is.character(x)
四、R语言数据结构类型
1、向量(表格的一列,一列只能一种数据类型)
#使用c()来创建
c(1,2,3)
c(“a”,”b”)
#c()也可以用来数据类型转换,如:
c(1,"a") #数值型与字符型转换,均变为字符型
[1] "1" "a"
c("a",TRUE) #逻辑型与字符型转换,均变为字符型
[1] "a" "TRUE"
c(TRUE,2) #逻辑型与数值型转换,均变为数值型
[1] 1 2
#连续的数字可用":"
c(3:10)
#重复的使用rep();有规律的序列用seq(),随机数用rnorm()
rep("a",times=5)
[1] "a" "a" "a" "a" "a"
seq(from=5,to=100,by=5)
[1] 5 10 15 20 25 30 35 40 45 50 55 60 65 70 75
[16] 80 85 90 95 100
#函数组合构建复杂向量
paste0(rep("sample",time=7),seq(from=4,to=30,by=4))
[1] "sample4" "sample8" "sample12" "sample16" "sample20"
[6] "sample24" "sample28"
#!!注意paste0与paste区别
paste(rep("a",times=5),1:5)
[1] "a 1" "a 2" "a 3" "a 4" "a 5"
#重复的使用rep();有规律的序列用seq(),随机数用rnorm()
rep("a",times=5)
[1] "a" "a" "a" "a" "a"
seq(from=5,to=100,by=5)
[1] 5 10 15 20 25 30 35 40 45 50 55 60 65 70 75
[16] 80 85 90 95 100
#函数组合构建复杂向量
paste0(rep("sample",time=7),seq(from=4,to=30,by=4))
[1] "sample4" "sample8" "sample12" "sample16" "sample20"
[6] "sample24" "sample28"
#!!注意paste0与paste区别
paste(rep("a",times=5),1:5)
[1] "a 1" "a 2" "a 3" "a 4" "a 5"2、数据框(类似于表格)3、矩阵4、列表五、对单个向量操作1、给变量名赋值> (x=c(1,2,3,4,5))
[1] 1 2 3 4 5
x <- c(1,2,3,4,5)#<-赋值符号可用快捷键option+-实现
x
[1] 1 2 3 4 5
#两种方式将赋值结果输出2、对单个向量进行操作(x <- c(2,8,4,8))
[1] 2 8 4 8
#简单数学计算
x+1
[1] 3 9 5 9
log(x)
[1] 0.6931472 2.0794415 1.3862944 2.0794415
sqrt(x)
[1] 1.414214 2.828427 2.000000 2.828427
#根据某条件进行判断,生成逻辑型向量(生成逻辑型向量个数与x中元素个数相等)
x>3
[1] FALSE TRUE TRUE TRUE
x==3
[1] FALSE FALSE FALSE FALSE
#初级统计
max(x) #最大值
[1] 8
min(x) #最小值
[1] 2
mean(x) #均值
[1] 5.5
median(x) #中位数
[1] 6
var(x) #方差
[1] 9
sd(x) #标准差
[1] 3
sum(x) #总和
[1] 22
length(x) #长度(向量里面元素个数)
[1] 4
unique(x) #去重复(保留重复值第一次出现时候)
[1] 2 8 4
duplicated(x) #对应元素是否重复(与前面出现元素比较)
[1] FALSE FALSE FALSE TRUE
!duplicated(x)
[1] TRUE TRUE TRUE FALSE
table(x) #重复值统计
x
2 4 8
1 1 2
sort(x)#排序(升序)
[1] 2 4 8 8
rev(sort(x))#排序(降序)
[1] 8 8 4 2
sort(x,decreasing = T)
[1] 8 8 4 2
六、对两个向量操作1、相同长度> x = c(1,3,5,1)
y = c(3,2,5,6)
逻辑比较,生成等长的逻辑向量
x == y #x与对应位置y相比
[1] FALSE FALSE TRUE FALSE
x %in% y #x的每个元素在y中存在吗
[1] FALSE TRUE TRUE FALSE
数学计算
x + y
[1] 4 5 10 7
连接
paste(x,y,sep=",")#paste可以自定义连接方式
[1] "1,3" "3,2" "5,5" "1,6"
paste(x,y,sep ="-")
[1] "1-3" "3-2" "5-5" "1-6"
交集 并集 差集
intersect(x,y)
[1] 3 5
union(x,y)
[1] 1 3 5 2 6
setdiff(x,y)#x里面有,y里没有的
[1] 1
setdiff(y,x)#y里面有,x里面没有
[1] 2 62、不同长度——循环补齐> x = c(1,3,5,6,2)
y = c(3,2,5)
x == y # 啊!warning!
[1] FALSE FALSE TRUE FALSE TRUE
Warning message:
In x == y : 长的对象长度不是短的对象长度的整倍数 #warning不代表错误
a=c(2,1,5,6,2,2,3,4,5)
y==a
[1] FALSE FALSE TRUE FALSE TRUE FALSE TRUE FALSE TRUE
#循环补齐(谁长谁说了算)3、循环补齐应用(简化代码)> paste0(rep("x",3),1:3)
[1] "x1" "x2" "x3"
paste0("x",1:3)
[1] "x1" "x2" "x3"七、向量筛选(取子集)——x[]1、x[逻辑值向量]:将TRUE对应值选出,FALSE舍去(依据逻辑值判断,[]中是与x等长的逻辑值向量) ps:注意-号优先级> x <- 8:12
根据逻辑值(与x等长)取子集
x[x==10]
[1] 10
x[x<12]
[1] 8 9 10 11
x[x %in% c(9,13)]
[1] 92、x[数值向量] (依据位置,位置下标从1开始,[]中是由x下标组成的向量)> x <- 8:12
根据位置取子集
x[4]
[1] 11
x[2:4]
[1] 9 10 11
x[c(1,5)]
[1] 8 12
x[-4]
[1] 8 9 10 12
x[-(2:4)]
[1] 8 12
#注意取不连续的位置用c()
x[1,5]
Error in x[1, 5] : 量度数目不对3、修改向量元素(修改一定要赋值!)修改向量中的某个/某些元素:取子集+赋值
x
[1] 8 9 10 11 12
#改一个元素
x[4] <- 40
x
[1] 8 9 10 40 12
改多个元素
x[c(1,5)] <- c(80,20)
x
[1] 80 9 10 40 204、向量作图简单向量作图
k1 = rnorm(12);k1
[1] 0.6543997 0.1743535 1.7244068 2.1252670 -0.8985623
[6] -0.2718248 1.2440448 -1.5326994 -1.1267285 0.4771538
[11] -1.7292906 -0.2294147
k2 = rep(c("a","b","c","d"),each = 3);k2
[1] "a" "a" "a" "b" "b" "b" "c" "c" "c" "d" "d" "d"
plot(k1)
boxplot(k1~k2)八、调整元素顺序——order()和sort()区别 调整元素顺序
x <- c("A","B","C","D","E");x
[1] "A" "B" "C" "D" "E"
x[c(2, 4, 5, 1, 3)]
[1] "B" "D" "E" "A" "C"
scores = c(100,59,73,95,45);scores
[1] 100 59 73 95 45
sort(scores)
[1] 45 59 73 95 100
scores[c(5,2,3,4,1)]
[1] 45 59 73 95 100
scores[order(scores)] #sort(x)约等于x[order(x)]
[1] 45 59 73 95 100
order(scores)
[1] 5 2 3 4 1sort(x)是对向量x进行排序,返回值排序后的数值向量。而order()的返回值是对应“排名”的元素所在向量中的位置。两者默认升序,可加descreaing=T降序排列PS:sort()在单变量排序中,效果较好;order()因为可以标记排序好之后的下标,在数据框中的排序操作,实用性超强,可以实现。#order应用
#scores依次属于以下几个小朋友,按照分数从低到高给小朋友的名字排序(两个向量等长)
kids = c("jimmy","nicker","lucy","doodle","tony")
scores = c(100,59,73,95,45);scores
[1] 100 59 73 95 45
kids[order(scores)]
[1] "tony" "nicker" "lucy" "doodle" "jimmy"
kids[sort(scores)]
[1] NA NA NA NA NA
当向量不等长时(人名>分数)
kids = c("jimmy","nicker","lucy","doodle","tony")
scores = c(100,59,73,95);scores
[1] 100 59 73 95
kids[order(scores)]
[1] "nicker" "lucy" "doodle" "jimmy"
当向量不等长时(人名<分数)
scores = c(100,59,73,95,45);scores
[1] 100 59 73 95 45
kids = c("jimmy","nicker","lucy","doodle")
kids
[1] "jimmy" "nicker" "lucy" "doodle"
kids[order(scores)]
[1] NA "nicker" "lucy" "doodle" "jimmy"九、向量匹配——match()ps: match(y,x)以y为模版调整x顺序(括号里谁在前面谁是模版),并返回x的元素在向量中位置;x[match(y,x)]谁在外面,谁就在后面> x <- c("A","B","C","D","E");x
[1] "A" "B" "C" "D" "E"
y <- c("B","D","E","A","C")
match(y,x)
[1] 2 4 5 1 3
x[match(y,x)]#谁在外面,谁就在后面
[1] "B" "D" "E" "A" "C"九、错题重现#生成10个随机数: rnorm(n=10,mean=0,sd=18),用向量取子集的方法,筛选出其中小于-2的值
b=rnorm(n=10,mean=0,sd=18);b[b<(-2)]
[1] -16.174121 -4.892846 -27.588588 -20.281114
#> b=rnorm(n=10,mean=0,sd=18);b[b<-2](-号优先级低,记得加括号;没有报错不代表没错)
#[1] 0.8782899
生成sample4,sample8,sample12…sample28
x=seq(from=4,to=30,by=4);paste0("sample",x)
[1] "sample4" "sample8" "sample12" "sample16" "sample20"
[6] "sample24" "sample28"
x=c(1,1,3,5,7),y=c(2,4,5,6,7)。下列哪些代码可以产生与x等长的逻辑值向量?A、B、C
A x>10
B x%in%y
C dumplicated(x)
D unique(x)
x=c(1,1,3,5,7)
y=c(2,4,5,6,7)
x>10
[1] FALSE FALSE FALSE FALSE FALSE
x%in%y
[1] FALSE FALSE FALSE TRUE TRUE
duplicated(x)
[1] FALSE TRUE FALSE FALSE FALSE
unique(x)
[1] 1 3 5 7
本文图与代码摘自生信技能树,感谢各位老师帮助