R语言笔记(一)
1.1 数据类型
#数值型
2 3 4 5 6 7
#字符串型
"a" "b" "c"
#逻辑型
FALSE(F) TRUE(T) NA
判断函数
class()
小技巧 1 :在 > 后面按向上键,可以修改上一条命令重新运行
[如图所示]
修改上一条命令.png
1.2 比较运算的返回的结果是逻辑值
# >, <, <=, >=, ==, !=
3==5 FALSE
3!=4 TRUE
1.3 逻辑运算
与&、或|、非!
多个逻辑条件的连接 与&、或|、非!
2<5&3>5 FALSE
2<5|3>5 TRUE
!2>5 TRUE
1.4 数据类型的转换与判断
- as 族函数实现数据类型之间的转换
**1. as.numeric()** 将其他数据类型转换为数值型
**2. as.logical()** 将其他数据类型转换为逻辑型
**3. as.charactor()** 将其他数据类型转换为字符型
- is族函数,判断,返回值为TRUE或FALSE
**1.is.numeric()**是否*数值型数据*
**2.is.logical()** 是否逻辑型数据
**3.is.charactor()** 是否字符型数据
1.5 数据的结构
Gene | logFC | positive | group |
---|---|---|---|
ACTR38 | -0.7488384 | FALSE | group1 |
ANLN | 6.5536345 | FALSE | group2 |
BAG1 | 5.7768669 | TRUE | group3 |
BLC2 | 0.4474848 | TRUE | group2 |
BIRC5 | 0.4453222 | TRUE | group1 |
RAB | 4.6776686 | FALSE | group2 |
ABCT | 7.9993303 | FALSE | group2 |
ANF | 3.5858595 | FALSE | group1 |
BALV | 3.8929289 | TRUE | group1 |
1) 向量 vector
数据框中的一列,只有一种数据类型
2) 数据框 data.frame
数据框是每个组件长度都相等的列表
数据框是列表的一种,数据框每一列就是列表的一个元素,所以每一列可以是不同类型但长度要相等
3) 矩阵 matrix
多个向量组成矩阵
4) 列表 list
小技巧 2
当你打开脚本时,出现乱码,可以按照下列顺序解决第一步:File
第二步:Reopen with Encoding
第三步:UTF-8
2.1 向量的生成
(1)用 c()逐一放到一起
> c("a","f","md","b")
[1] "a" "f" "md" "b"
(2)连续的数字用冒号“:”
> 1:10
[1] 1 2 3 4 5 6 7 8 9 10
(3) 有重复的用rep(),有规律的序列用seq(),随机数用rnorm
> rep("gene",times=10)
[1] "gene" "gene" "gene" "gene" "gene" "gene" "gene" "gene" "gene" "gene"
> seq(from = 3,to = 21,by = 3)#等差数列
[1] 3 6 9 12 15 18 21
> rnorm(n = 5, mean = 3, sd = 5)
[1] 7.286638 -2.147017 10.547481 2.308747 5.017196
(4)通过组合,产生更为复杂的向量。
> paste0(rep("gene",times=15),1:15)
[1] "gene1" "gene2" "gene3" "gene4" "gene5" "gene6" "gene7" "gene8"
[9] "gene9" "gene10" "gene11" "gene12" "gene13" "gene14" "gene15"
小技巧3:
1、数值1和0可被转换为逻辑值TURE和FALSE
2、仅有部分字符串可转换为数值和逻辑值
“2” “TRUE”
3、强行转换会引入NA
2.2 对单个向量进行的操作
-
向量的赋值+输出
/规范的写法
x<-c(1,2,3)#赋值符号等号“=”是不规范的
#快捷方式是ALT 加 -
/赋值+输出
第一种
> (x <- c(1,3,5))
[1] 1 3 5
第二种
> x <- c(1,3,5);x
[1] 1 3 5
第三种
> x <- c(1,3,5)
> x
[1] 1 3 5
-
简单的数学计算
> x <- c(1,3,5)
> x
[1] 1 3 5
> x+1 #加法
[1] 2 4 6
> log(x) #取对数
[1] 0.000000 1.098612 1.609438
> sqrt(x) #开平方
[1] 1.000000 1.732051 2.236068
> x %/% 10 #取整
[1] 0 0 0
> x %% 3 #取余
[1] 1 0 2
-
根据某条件进行判断,生成等长的逻辑向量
> x <- c(1,3,5)
> x
[1] 1 3 5
> x>3
[1] FALSE FALSE TRUE
> x==3
[1] FALSE TRUE FALSE
-
初级统计
> x <- c(1,3,5);x
[1] 1 3 5
> max(x) #最大值
[1] 5
> min(x) #最小值
[1] 1
> range(x) #max和min
[1] 1 5
> which.max(x) #最大值下标
[1] 3
> which.min(x) #最小值下标
[1] 1
> mean(x) #均值
[1] 3
> median(x) #中位数
[1] 3
> var(x) #方差
[1] 4
> sd(x) #标准差
[1] 2
> sum(x) #总和
[1] 9
> sort(x) # 排序
[1] 1 3 5
> length(x) # 长度
[1] 3
> unique(x) # 去重复
[1] 1 3 5
> table(x) # 返回第一值
x
1 3 5
1 1 1
2.3 对两个向量进行的操作
> y=c(3,2,5)
> x=c(1,3,5)
(1)逻辑比较,生成等长的逻辑向量
> x==y
[1] FALSE FALSE TRUE
> x %in% y #x的元素是否在y中
#对x里的每个元素进行判断,判断它是否在y中存在,存在就返回TRUE,不存在就返回FALSE”。
[1] FALSE TRUE TRUE
(2)数学计算
> x+y
[1] 4 5 10
(3)连接
> paste(x,y,sep=":")
[1] "1:3" "3:2" "5:5"
(4)交集、并集、差集
> intersect(x,y)
[1] 3 5
> union(x,y)
[1] 1 3 5 2
> setdiff(x,y)
[1] 1
-
接下来引入一个概念
循环补齐
当两个向量的长度不一致时,短的自动按照之前的补齐
> y = c(3,2,5)
> x = c(1,3,5,6,2)
> x == y
[1] FALSE FALSE TRUE FALSE TRUE
Warning message:
In x == y : longer object length is not a multiple of shorter object length
先了解两个函数
rnorm()和sample()的区别
//rnorm(n, mean = 0, sd = 1)
n 为产生随机值个数(长度),mean 是平均数, sd 是标准差
使用该函数的时候后,一般要赋予它3个值
例如:
> rnorm(10, mean = 4, sd = 1)
[1] 4.334495 2.470896 3.875235 2.694793 2.930649 2.699544 3.886282 4.680146
[9] 4.873911 3.903600
//sample(x, size, replace = FALSE, prob = NULL)
命令是从x中随机抽取size大小的样本;
replace是否放回抽样
prob 设置所要抽取的每个元素被抽取的概率
> sample(1:100,size=8)
[1] 74 22 88 46 67 18 77 53
了解下set.seed()函数
//set.seed()函数是为了保证你随机生成的随机数前后一致
set.seed()括号里面的参数可以是任意数字,是代表你设置的第几号种子而已,不会参与运算,是个标记而已。
> set.seed(5)
> rnorm(10)
[1] -0.84085548 1.38435934 -1.25549186 0.07014277
[5] 1.71144087 -0.60290798 -0.47216639 -0.63537131
[9] -0.28577363 0.13810822
> set.seed(5)
> rnorm(10)
[1] -0.84085548 1.38435934 -1.25549186 0.07014277
[5] 1.71144087 -0.60290798 -0.47216639 -0.63537131
[9] -0.28577363 0.13810822
下面作业来了
如何从50个数中筛选小于7的?
> x=sample(1:20,size=15);x
[1] 11 14 18 16 17 9 10 19 4 8 20 12 15 13 5
> x<7
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE
[10] FALSE FALSE FALSE FALSE FALSE TRUE
> y=x[x<7]
> y
[1] 4 5
有一个思考题
从1000个基因名当中挑选出指定的30个
思路一:运用 %in%
step1:将1000个基因名赋值给x
step2:将指定的30个基因复制给y
step3: x %in% y #x当中的元素是否在y中
举例说明:
> a=c(1,2,3,4,5,6,7,8,9,10)
> b=c(3,4,5)
> a%in%b
[1] FALSE FALSE TRUE TRUE TRUE FALSE FALSE FALSE FALSE
[10] FALSE
> a[a%in%b] #注意a、b的顺序
[1] 3 4 5
思路二:取交集
函数intersect()
> g=intersect(a,b);g
[1] 3 4 5
2.4 向量取子集(主要分为按逻辑值和下标)
1)根据逻辑值取子集
> (x <- 8:12)
[1] 8 9 10 11 12
> x[x==8:10] # 1.1)==
[1] 8 9 10
> x[x<10] #1.2) <
[1] 8 9
> x[x %in%c(9,13)] #1.3) %in%
[1] 9
2) 根据位置(下标)取子集
> x[4] #第4个位置
[1] 11
> x[2:4] # 第2到第4
[1] 9 10 11
> x[c(1,5)] #第1和第5
[1] 8 12
> x[-4] # 除去第4位置
[1] 8 9 10 12
> x[-c(2:4)] #除去第2到4位置
[1] 8 12
2.5 修改向量中的某个或某些元素
1)例子1
> (x=8:12)
[1] 8 9 10 11 12
> x[3] <- 16 #修改第3个元素;取子集+赋值
> x
[1] 8 9 16 11 12
2)例子2
> (x=8:12)
[1] 8 9 10 11 12
> x[x>10] <- 10 #将大于10的元素修改为10
> x
[1] 8 9 10 10 10
-
练习题
1.将基因名“ACTR3B”,“ANLN”,“BAG1”,“BCL2”,“BIRC5”,“RAB”,“ABCT”,“ANF”,“BAD”,
“BCF”,“BARC7”,“BALV” 组成一个向量,赋值给x。
> x=c("ACTR3B","ANLN","BAG1","BCL2","BIRC5","RAB","ABCT","ANF","BAD","BCF","BARC7","BALV");x
[1] "ACTR3B" "ANLN" "BAG1" "BCL2" "BIRC5" "RAB"
[7] "ABCT" "ANF" "BAD" "BCF" "BARC7" "BALV"
2.用函数计算向量长度
> length(x)
[1] 12
3.用向量取子集的方法,选出第1,3,5,7,9,11个基因名
> y=c(1,3,5,7,9,11)
> x[y]
[1] "ACTR3B" "BAG1" "BIRC5" "ABCT" "BAD" "BARC7"
4.用向量取子集的方法,除倒数第2个以外所有的基因名
> x[-(length(x)-1)]
[1] "ACTR3B" "ANLN" "BAG1" "BCL2" "BIRC5" "RAB"
[7] "ABCT" "ANF" "BAD" "BCF" "BALV"
5.用向量取子集的方法,选出在c(“ANLN”, “BCL2”,“TP53”)中有的基因名。x %in% y ,如何确定两个向量谁在前、谁在后?
需要确定的是,你的操作对象谁,对谁进行判断?
根据题目,是对12个进行判断。所以它在前,返回的逻辑值向量长度为12,才可以将这个向量放入[ ]中,对x取子集,将对应结果为TRUE的留下,而FALSE 丢掉。
> x%in%c("ANLN","BCL2","TP53")
[1] FALSE TRUE FALSE TRUE FALSE FALSE FALSE FALSE FALSE
[10] FALSE FALSE FALSE
> x[x%in%c("ANLN","BCL2","TP53")]
[1] "ANLN" "BCL2"
6.修改第6个基因名为“a” 并查看是否成功
> x[6] <- "a";x
[1] "ACTR3B" "ANLN" "BAG1" "BCL2" "BIRC5" "a"
[7] "ABCT" "ANF" "BAD" "BCF" "BARC7" "BALV"
7.生成100个随机数: rnorm(n=100,mean=0,sd=18)
将小于-2的统一改为-2,将大于2的统一改为2
z[z< -2]=-2#这里注意赋值符号和大于号减号的区别
z[z>2]=2
向量的进阶的几个问题
1.两个不同类型的向量合并在一起会怎么样?
> x=c(1,2,3,4,5,6)
> y=c("a","b","c","d","e","f")
> z=paste(x,y);z #注意paste()和paste0()的区别
[1] "1 a" "2 b" "3 c" "4 d" "5 e" "6 f"
> class(z)
[1] "character"
2.如何将两个向量合到一起,组成一个长向量?
> d=c(x,y);d #未去重复值
[1] "1" "2" "3" "4" "5" "6" "a" "b" "c" "d" "e" "f"
> union(x,y) #去重复值
[1] "1" "2" "3" "4" "5" "6" "a" "b" "c" "d" "e" "f"
3.如何在向量首/尾/中间某位置增加一个元素?
1)首尾
x=c(3,x)
x=c(x,4)
2)中间第n 位
n=3
x=c(1,3,5,8,6)
x
[1] 1 3 5 8 6
y=c(x[1:n-1],7,x[n:length(x)])#元素为 7
y
[1] 1 3 7 5 8 6
写成函数形式
join <- function(x,n,y){
c(x[1:n-1],y,x[n:length(x)])
}
x=c(1,3,5,8,6)
join(x,3,7)
[1] 1 3 7 5 8 6
4.如果向量x和y内容一致但顺序不一致,如何按照x的顺序排列y?
x=letters[1:5]
y=letters[c(3,1,2,5,4)]
match(x,y) #按照x的顺序重排y
[1] 2 3 1 5 4
y[match(x,y)]
[1] "a" "b" "c" "d" "e"
5.数据框列的顺序错乱,如何重排?
步骤1: 生成示例数据框
df=data.frame(matrix(rnorm(15),ncol=5))
colnames(df)=letters[c(3,1,2,5,4)]
df
## c a b e d
## 1 0.0791991 0.2823956 1.5775594 0.3532114 0.005290532
## 2 0.1520918 -0.5809870 0.7543086 0.2400143 -0.107861008
## 3 0.1016834 -0.5116693 -0.6895286 -0.5309626 -0.300314420
步骤2: 写出正确顺序
s=letters[1:5];s
## [1] "a" "b" "c" "d" "e"
步骤3:match排列,生成索引
sy=match(s,colnames(df));sy
## [1] 2 3 1 5 4
步骤4:取子集
基础知识:x[m,n]取子集,m表示行,n表示列,m和n的数据结构应为向量。
df2=df[,sy]
df2
## a b c d e
## 1 0.2823956 1.5775594 0.0791991 0.005290532 0.3532114
## 2 -0.5809870 0.7543086 0.1520918 -0.107861008 0.2400143
## 3 -0.5116693 -0.6895286 0.1016834 -0.300314420 -0.5309626