在这里记录下学习R过程中的一些小问题
写在前面:作为一个一年前看过R一整本书的”新手”,时隔一年开始使用R做文本处理,以前一直用shell语言处理文本。最近刚开始,每一步都要查半天,甚至取哪一列数据都不知道怎么操作(所以事实证明,只看书并没有用),最近准备开始用R处理我需要,所以会应用一些实例开始学习,其中用到的一些函数,我都会整理到此文章中,算是巩固的过程以及记录,以后需要的时候来查。只有实战,才是学习语言最快的方法!!
一,rnorm(10, mean = 0, sd = 1) # 正态分布的随机数
二,R read.table()读取数据过程中row.names=1与row.names=NULL参数的区别(直接看例子就能明白):
eg:
data_matrix = "KO1;KO2;KO3;WT1;WT2;WT3
Gene1;1.3;1.2;1.4;3.1;3.2;3.3
Gene2;1.1;1.9;1.6;2.3;2.2;2.1
Gene3;16.8;17.0;18.0;33.0;30.0;35.0
Gene4;11.0;13.0;12.0;25.0;26.0;28.0
Gene5;20.0;25.0;23.0;9.0;10.0;13.0
Gene6;33.0;30.0;35.0;16.0;17.0;16.0
Gene7;2.0;2.3;2.0;1.4;1.8;1.4
Gene8;3.0;3.6;3.0;1.2;1.9;1.2"
> b<-read.table(text=ata_matrix,header = TRUE,sep=";",row.names = 1)
> b
KO1 KO2 KO3 WT1 WT2 WT3
Gene1 1.3 1.2 1.4 3.1 3.2 3.3
Gene2 1.1 1.9 1.6 2.3 2.2 2.1
Gene3 16.8 17.0 18.0 33.0 30.0 35.0
Gene4 11.0 13.0 12.0 25.0 26.0 28.0
Gene5 20.0 25.0 23.0 9.0 10.0 13.0
Gene6 33.0 30.0 35.0 16.0 17.0 16.0
Gene7 2.0 2.3 2.0 1.4 1.8 1.4
Gene8 3.0 3.6 3.0 1.2 1.9 1.2
> b<-read.table(text=ata_matrix,header = TRUE,sep=";",row.names = NULL)
> b
row.names KO1 KO2 KO3 WT1 WT2 WT3
1 Gene1 1.3 1.2 1.4 3.1 3.2 3.3
2 Gene2 1.1 1.9 1.6 2.3 2.2 2.1
3 Gene3 16.8 17.0 18.0 33.0 30.0 35.0
4 Gene4 11.0 13.0 12.0 25.0 26.0 28.0
5 Gene5 20.0 25.0 23.0 9.0 10.0 13.0
6 Gene6 33.0 30.0 35.0 16.0 17.0 16.0
7 Gene7 2.0 2.3 2.0 1.4 1.8 1.4
8 Gene8 3.0 3.6 3.0 1.2 1.9 1.2
三,常用的函数
1,gather函数:把一列的列名和列名下的变量变成两列既含有变量名有含有数据的数据框。(矩阵变换)
gather(
data,
key = "key",
value = "value",
...,
na.rm = FALSE,
convert = FALSE,
factor_key = FALSE
)
举例:
> stu<-data.frame(grade=c("A","B","C","D","E"), female=c(5, 4, 1, 2, 3), male=c(1, 2, 3, 4, 5))
> stu
grade female male
1 A 5 1
2 B 4 2
3 C 1 3
4 D 2 4
5 E 3 5
> gather(stu, gender, count,-grade)
#gender 以及 count 是自己起的列的名字
grade gender count
1 A female 5
2 B female 4
3 C female 1
4 D female 2
5 E female 3
6 A male 1
7 B male 2
8 C male 3
9 D male 4
10 E male 5
参考原名文更详细
2,separate()
分割,将一列变量分割为两列
> stu_fix
grade gender_class gender class count
1 A female_1 female 1 5
2 B female_1 female 1 4
3 C female_1 female 1 1
4 D female_1 female 1 2
5 E female_1 female 1 3
>stu_fix<- stu2_new %>% separate("gender_class",c("gender","class"),sep="_",remove = T)
#不同的表达
>stu_fix<- separate(stu2_new,"gender_class",c("gender","class"),sep="_",remove = T)
#结果是一样的,把gender_class这一列用"_"符分开成两列"gender","class",sep也可以是数字表示从第几个字符后开始分割。
grade gender class count
1 A female 1 5
2 B female 1 4
3 C female 1 1
4 D female 1 2
5 E female 1 3
6 A male 1 1
...
3,spread()
spread用来扩展表,把某一列的值(键值对)分开拆成多列。
spread(data, key, value, fill = NA, convert = FALSE, drop =TRUE, sep = NULL)
key是原来要拆的那一列的名字(变量名),value是拆出来的那些列的值应该填什么(填原表的哪一列)
举例:
```r
> stu3
name test class1 class2 class3 class4 class5
1 Sally midterm A <NA> B <NA> <NA>
2 Sally final C <NA> C <NA> <NA>
3 Jeff midterm <NA> D <NA> A <NA>
4 Jeff final <NA> E <NA> C <NA>
5 Roger midterm <NA> C <NA> <NA> B
6 Roger final <NA> A <NA> <NA> A
7 Karen midterm <NA> <NA> C A <NA>
8 Karen final <NA> <NA> C A <NA>
9 Brain midterm B <NA> <NA> <NA> A
10 Brain final B <NA> <NA> <NA> C
> stu3_new<-gather(stu3,key="class",value="score",na.rm=TRUE,-name,-test)
> stu3_new
name test class score
1 Sally midterm class1 A
2 Sally final class1 C
9 Brain midterm class1 B
10 Brain final class1 B
13 Jeff midterm class2 D
.....
> spread(stu3_new,test,grade)
name class final midterm
1 Brain class1 B B
2 Brain class5 C A
3 Jeff class2 E D
4 Jeff class4 C A
5 Karen class3 C C
6 Karen class4 A A
7 Roger class2 A C
8 Roger class5 A B
9 Sally class1 C A
10 Sally class3 C B
4,unite()
Convenience function to paste together multiple columns into one.
Usage:
unite(data, col, …, sep = “_”, remove = TRUE, na.rm = FALSE)
data: a dataaframe,如果自己的数据是一个矩阵或者对于新手不太清楚自己的数据是什么类型就直接用as.data.frame(a),col,…,sep=""
col:新的列名,用引号括起来。
… :要合并的列名。
remove=TRUE 删除原来的列
na.rm :if TRUE,在合并前删掉空值
eg:
a=unite(as.data.frame(a),"A1",REF,V6,sep=":")
#首先把a转变为数据框,“A1”是列的新名字,REF和V6是要合并的两列的列名,用“:”符号连接两列
5,数据框新增列
使用$符号,例如:
a$N_CHR=rep(2,nrow(a))
#为数据框a新增一列名为N_CHR的列,列的内容为每一行用2填
6,transform()
为数据框添加新的列
例如:
a<-transform(a,new1=NA,new2=NA)
#为数据框a增加新的两列,列名为new1,new2,且将其用空值填充
7,sample()函数
随机抽样
sample_n((tbl, size, replace = FALSE)
参数说明:tbl数据,size选取的数据行数,replace=true/false是否替换样本(主要参数,如果是TRUE,则可以重复选择即放回抽样,如果是FALSE,则是不放回抽样)
举例:
> x=1:10
> sample(x=x,size=5,replace=T)
[1] 4 7 2 4 8
8,apply()函数
apply函数是最常用的代替for循环的函数。apply函数可以对矩阵、数据框、数组(二维、多维),按行或列进行循环计算,对子元素进行迭代,并把子元素以参数传递的形式给自定义的FUN函数中,并以返回计算结果。
函数定义:
apply(X, MARGIN, FUN, ...)
#X:数组、矩阵、数据框
#MARGIN: 按行计算或按按列计算,1表示按行,2表示按列
#FUN: 自定义的调用函数
#…: 更多参数,可选
9,assign()函数
赋值函数
assign("x",100))
#结果为:[1] 100
10,merge()函数
merge(x, y, by = intersect(names(x), names(y)),
by.x = by, by.y = by, all = FALSE, all.x = all, all.y = all,
sort = TRUE, suffixes = c(".x",".y"),
incomparables = NULL, ...)
#merge函数参数的说明:
#x,y 要合并的两个数据集
#by,用于连接两个数据集的列,intersect(a,b)值向量a,b的交集,names(x)指提取数据集x的列名
#by = intersect(names(x), names(y)) 是获取数据集x,y的列名后,提取其公共列名,作为两个数据集的连接列, 当有多个公共列时,需用下标指出公共列,如names(x)[1],指定x数据集的第1列作为公共列
#也可以直接写为 by = ‘公共列名’ ,前提是两个数据集中都有该列名,并且大小写完全一致,R语言区分大小写
#by.x,by.y:指定依据哪些行合并数据框,默认值为相同列名的列
#all,all.x,all.y:指定x和y的行是否应该全在输出文件 指定合并类型的逻辑值。缺省为false**,all=FALSE (仅返回匹配的行,也就是交集).**
#sort:by指定的列(即公共列)是否要排序
#suffixes:指定除by外相同列名的后缀
#incomparables:指定by中哪些单元不进行合并
11,subset() 函数:
subset(dataset , subset , select )
#dataset 是 要进行操作的数据集
#subset 是对数据的某些字段进行操作
#select 选取要显示的字段
**#Example :**
hightech
aa = subset(hightech,year==2001&province=="北京",select = c("year","province","PAT"))
bb = subset(hightech,year==2001|province=="北京",select = c("year","province","NPO"))