目前看的是R语言实战这本书
1、当输入png("lxc.png")这种需要加双引号。但是如果在括号中多加了一个双引号,那么"lxc.png"", R ide就会显示是函数输入的类型,显示加号,原因是双引号没有匹配,自己输错了,所以遇到没有匹配的直接输入缺失的匹配即可。
2、但是还有一点很重要,R给人感觉就是png("lxc.png")这个好像是打开画板,但是如果下面不画画是什么都没有的,并不是说ide界面上显示图像了,就可以直接png()保存了,其实png就是打开画板,然后画图句子使用,然后dev.off()这个函数关闭画板才会flush到真正的文件中。同理,pdf()都是如此。保存图片与图片自身是否显示无关。
3、help("sink")记得加引号。而其中sink函数的结束方法是再次输入空参数。sink()即可。file="lxc"注意要添加双引号。当然sink函数使用也是,先打开,然后后面的输出才写上,当然结束不再是dev.off()而是sink()参数空即可。
4、options(digits=3)其中options是显示(空的时候就是显示)或者设定R的运行环境变量。而digits=3表示显示小数点3个数长。默认是7.
5、对普通的画图为:
plot(number, count, yaxt="n", xaxt="n",xlab="x 轴名字",type="b")
上述表示为:yaxt xaxt都是将数据轴的标度和标度值完全去掉,但是可以设置轴的名字,后面设置标度和标度值使用:
axis(side=1, at=c(1,3,5,6,7), lables=(ni, hao, a , man, go));等均可匹配,at表示刻度值范围。
但是有个问题就是太拥挤的不可见怎么缩小y轴的尺寸,而缩小尺寸值是在axis()命令设置at这个参数的时候就设置,使用cex.axis=0.5就表示缩小一半。而当直接使用默认的坐标刻度的时候,那么就在plot中直接放cex.axis=0.5即可。同样两个地方可以用的有:cex.lab=0.5 只缩放坐标轴的名称。 cex.main=0.只缩放主标题 cex.sub只缩放副标题。
当然上述除了axis要设置at值,还有par函数,但是该函数主要是作用于整个画布环境,设置完后,不会对当前已经显示的影响,而只会影响后面重新生成的图片。可以设置,par(cex.axis=0.5, )
其中设置画布大小的为:par(pin(11,7))是目前自己试出来的最大画布。
6、对于定义的function来说,x<-function(type=1){}
这种function中的参数意思是有一个参数,如果你不输入参数默认就是1,所以参数仍然是一个,虽然看着是个等式
7、时间函数是大写Sys.time()这个就足以输出了,但是如果想自己控制格式用format(Sys.time(), "%a,%b,%d,%y") 与"%A,%B,%d,%y"显示还不一样,后者显示的星期和月份都是全称,而前者是缩写因为是小写的a b
8、对于read.table()读txt文件的时候,需要使用read.table("路径加引号",seq="空格还没识别出来")
然后读成矩阵或者数据框。重命名其中列名用names(xxx)[n]<-c(x,x,x,x)必须是向量,不能是标量,但是单个的时候还是可以的例如单个1默认成向量1,单个字符串加双引号默认成单个向量。且必须是xxx[n]两者分开使用好奇怪。或者names()[1:n]都修改。
实在不会修改,还有fix()这个函数将数据框显示成表格让你使用。
rename(data3, c(oldname="newname".......))而 直接names(data3)是打印出原有的表头列名字。
9、对取出来的值进行判断是否空缺,is.na()即可对向量判断,也可以对数据框进行判断。
10、apply函数是对矩阵,数组,数据框的一个维度上面使用函数的,apply(x, margin, fun, ...)而sapply(x, fun, option)和lapply(x, fun , option) 其中sapply是对任何数据都可用,而lapply是用于list专用。
11、就是说对于TRUE当参数,只能将向量类型的传进去,例如一个矩阵10*3,怎么把矩阵中全部是数字的给输出出来,那么就是将矩阵这个矩阵转为由TRUE填充的矩阵,这样就可以将其当成参数,而如果只用下标表示,那么不行。mean(!is.na(x))这样才行。就是说TRUE值想起作用,只能以数据结构形式组织起来当成参数使用。
12、注意自己可以创造逻辑值。例如y<-c("c","b","a")是一个向量用is.na()判断倒是能够生成3个逻辑值。而自己用c(TURE,TRUE,TRUE)才是一个逻辑值向量。与11条相结合就可以将向量或者数据框的内容利用逻辑向量编程一个向量使用。因为涉及到数据计算的时候,有时候只能使用纯数值的向量,不能使用数据框去计算。例如sd()标准差函数,只能使用vectory这种类型对于mtcars这种date.frame不能直接计算的。
13、x=read.table(file.choose())这个还让选择路径。哈哈。
14、对于不规则的txt文件,那么使用readLines(“路径”)函数,即可得到字符串向量,是真的大啊。例如自己的 chr [1:93906]有这么多行。必须得一行一行分析,首先怎么去掉特定的一些内容??
其实处理文本这些脏活是可以给python来处理的。。!!先处理了再用R来统计也行。
下面专门开始学习的『正则表达式』和『字符处理函数』https://www.cnblogs.com/awishfullyway/p/6601539.html
nchar()字符串长度。它与length()函数的区别是后者统计的是元素个数。
paste()是用于黏合多个字符串到一个字符串上的。即使有不是 字符串的内容也能转换为字符串、
strsplit()函数正好是将字符串按照某种形式进行划分的。是paste()的逆向操作。(参数是同样的可以输入以什么做间隔的双引号即可)
substr()字符串截取函数,参数是:从子集开始位置到终止位置。就是源头参数加两个数字。substring()函数同样。
gsub()字符串替代,找到sub字符串然后用新的字符串代替。而sub()函数只替换第一个发现的结果,并不会都替换的。而chartr()函数也是字符串替换。
grep()字符串匹配。搜索到后返回其位置索引。grepl()函数多了一个l表明找到索引后返回的是逻辑值。
大小写转换函数,toupper(), tolower(), casefold(),
字符(串)的格式化(定制)输出函数:sprintf()、sink()、cat()、print()、strtrim()、strwrap()
例子:strsplit(x, split="\\s+") 这个效果等效于strsplit(x, split=" ")其中s+是正则表达式中所有与空格相关的空格项。
例子中: num1<-grep(pattern="for finished",x)表示的是只要有个元素中含有这部分pattern内容,那么就返回这个元素的下标。只要x1<-x[-num1]其中num1是一些下标组成的数组。
怎么去除方括号内的内容??有什么命令。
gsub("\\(.*\\)","",字符串)例如这个就是匹配到括号内所有值的,替换即可。
1、向量就是使用c表示连接的,并且向量的元素表示就是与数组相同为:x[1]或者x[2:5]都行。
2、超级赋值<<-赋值运算符,可以在函数内给全局变量赋值。
3、查看类型mode(x)
4、矩阵往向量处变化时候,使用m<-rbind(c(), c())可以生成一个矩阵。因此矩阵含有行,列。同样矩阵使用下标索引,但是单个元素使用两个下标,而想找一行或者一列的,那么使用的下标是: 逗号和一个值。 m[,1]表示第一列。而创建矩阵方法:m<-matrix(vector,nrow=, ncol=, byrow=TRUE, dimnames=list(rname,cname)) 其中rname cname分别是字符串向量。此时涉及到了一个行列名称问题,但是还没有学习list的。
5、矩阵都是2维的,而只有数组才是可以使维数超过2维,但是数组同样是同类型的元素。a<-arrary(vector, dimensions, dimnames) 其中vector是数据,第二个是数值向量。第三个是名称列表。已经说明了其内容。
6、列表list是与向量很像,但是每个元素都可以扩充为一组元素组成的向量(向量可以由不相同的元素组成,只是都看成字符而已)。所以才会出现list(rname,cname)这样才是将其按照同等地位组合在一起,很多时候是一个函数的返回值,更像结构体,各种类型都可以放进去返回,例如hist(Nile)这个返回值就是一个list类型。而list的访问也是使用mingcheng $xxx 例如:x<-list(u=2,v="abc")那么x$u就是2.
注意也就是list使用美元访问,但是也是在有listname情况下,如果没有listname的话,是不能使用$的。。。只能使用双方括号!!![[ ]]。然后选中一个小组件,然后再用另外方括号选择更小的内部例如:x[[1]][2]和y$u[2]效果是一样的。都是选第一组中的第二个元素。 数组矩阵是为了使用数据的几行几列,而list是为了更简便粗暴地包含更多元素内容。
list也很特殊,当元素相同时候,可看成向量,不相同的时候,可看成数据框,不看成向量即可。
7、数据框 数据框其实就是列表,只是数据框是以不同类型元素的数组类型表示的。可以看成由同一列构成的向量当成list的每个成员。。。内容都一样,只是组织形式不一样,有时候统计员工信息,肯定数据框更方便显示,但是硬把每一列当成向量。而数据框要当成数组使用,所以访问元素使用下标要更好的。
d<-data.frame(list())这种方式组成数据框,也能看出其与list相同。而数据框一般是通过读取文件和数据库得到的。
使用方括号取值,不同级别才用[][]类型,例如list中的矩阵类。而相同级别的使用[x,y]这种。。数据框中直接p[1:2]取值,表明取1和2列。。类似于list.
8、因子是为了给向量进行分类,并将其存储为级别的数据对象,
9、R语言类的意义:就是函数会根据数据类型的不同,做出不同的处理,例如summary()函数,自己就不用担心数据类型。
10、read.table()得到的是数据框类型的r对象,
11、可以使用attributes()列出所有组件。而str() mode()都是一种打印,而summary()打印的信息更详细。 typeof()是查看数据类型。
12、R都是使用一种方法解出一种答案。
13、想得到函数help函数名不用加双引号,但是如果是特殊字符或者一些保留字例如for那就要加上双引号查询了。
14、example(seq)这个就是给你一系列使用方法,而画图总example(persp)就是各种等高线图。按回车键就是下一个图片显示。
15、谷歌搜索技巧:filetype:R permutations -rebol 表示搜索文件类型是R的语言脚本,并且排除rebol类型。
16、自动补齐,能看出来。20位加上1:2就是自动补齐。 向量化就是函数对每个元素应用函数。 查找向量的一部分。
本来R中可以不定义就使用,但是涉及到部分成员,那是不行的,y[1]=5就不对,必须y<-vector(length=2)然后赋值。y[1] y[2] 即可。等效于y<-c()
17、R语言中运算符都是一个函数,所以可以做向量式运算的。
18、很重要向量的取部分使用的索引: 向量索引: 向量1 [向量2] 返回的是向量1中索引为向量2的那些值。 下标可以重复使用,符号代表删除
19、符号:也可以创造向量的!!! 冒号比加减更有优先级。输入?syntax就可以显示出符号优先级。 seq也可以创建向量。但是seq还有个用途就是参数非空的时候,seq(x)与1:length(x)等效。即使x<-c(5,11,9)都可以得到的是:seq(x)是1,2,3
20、req()函数同样可以生成一个向量。
21、any() all()函数都是判断逻辑值的。
22、round函数是四舍五入。
23、sapply()函数是对向量使用,然后返回矩阵类型。
24、在函数中加上na.rm=TRUE就可以将na无效值给删除掉。
25、%%求余运算。 NULL是什么都没有,而NA是会一直存在,只是表达无效而已。所以a<-NULL 时候a<-c(a, 1)这种是会不显示NULL的,但是NA的话还是会在的为NA,1
26、z[z*z<8]表示的是索引为布尔值向量。所以可用有效。
27、向量x中所有大于3的值替换为0那么一行就可以x[x>3]<-0
28、subset的删选可以去掉NA, subset(x, x>5)
29、which(z*z>8)返回的是下标组成的向量。当然也是根据布尔向量判断出来的下标。
30、就是看着的ifelse(b,u,v)同样是对b,u,v这三个向量中每个元素进行的判断!!!!
31、判断两个向量是否相等,使用==是对每个元素判断,这样不好。而all() identical()函数则是完全判断成一个结果。但是identical有点太谨慎,同样值是1一个整数,一个浮点数,虽然值都是1也不行。
32、name()函数是查看名字或者命名,而name(x)<-NULL则是去除名字。
32、注意,R语言是可以比c语言少for循环的,因为其可以向量化的特征,所以很容易从向量集中得出某些特征的值。但是如果涉及到重新排序的类似操作,那么必须得有个新的向量被定义出来使用,原向量只是操作对象。例如找到每个单词的出现次数,就是将单词作为标签创建一个新的list即可,然后在此基础上还能排列词频顺序,使用order返回的是对应的索引值!!这样就简化多了,因为将order结果直接用于向量索引就是新的向量或者链表。
33、还有,由于数据框要比list约束多,当然数据框是隶属于list的,所以数据框可以使用list的访问方式访问数据框,但是list却不能使用数据框的矩阵访问方式。因为数据框就是比list多出一个矩阵结构。,
34、subset函数里面是有两个参数的,第一个是数据集,第二个是判断条件,而平常是将判断条件产生的布尔向量当成索引的,但是为了防止NA的破坏,所以使用subset自动删除NA
35、complete.cases是对数据框中的行进行NA判断产生布尔值的。可以用于删除NA的索引。
36、对于数据框可以使用rbind和cbind.但是添加的长度要符合原数据框。添加也可以直接list$a<-就算是添加了。多用于类似矩阵的数据框添加新列等操作。
37、前面提到apply一般是用于向量的,因为向量的类型相同,而apply也可以用于数据框,只是要求数据框内容要完全类型相同,例如对于数据进行mean计算。apply(frame, 1, hanshu)表示对每一行进行hanshu操作。
38、一般来说,数据框的数据处理,是想使用因子的,而list的使用是不想使用因子,如果read的字符串不想当成因子,那么使用stringisfactor=TRUE,true表示不当成因子这个有点相反的意思。,
39、merge()用于合并有相同列名称的两个数据框,还有by.x by.y两个参数,用于指定合并数据框中值相同但是名称不同的情况。这样就可以按照指定来合并了。merge(a,b, by.x=行数,by.y=行数)
40、判断数据框中每个记录行是否有相同的长度,使用count.fields("数据集", sep=",") 就可以得到每个记录行的长度,然后使用all判断上述结果向量是否全部大于某个值。。
41、如果对数据框使用lapply那么就是用于数据框的每个列!!!并且返回值成了列!!!
42、当你想按照某个列的值排序并保持数据框中的变量关系不变,例如一个人的年龄还是这个人的年龄,不会变错位。那么就要使用因子了,所以因子适用于数据框是有原因的。。
43、因子对应的是统计学中的名义变量或者分类变量。,本质不是数字,
44、因子可以看成是包含了更多信息的向量。更多的信息一般是指不同的level. 可以使用factor函数将向量变为一组因子。例如x<-c(5,12,3,12)得到的因子是3个level。cf<-factor(x)cf只有三个level但是length(cf)显示的是实际数据长度不是因子的level长度
45、因子向量,首先包含的是数据,只是根据数据,然后进行的因子分类,所以包含的数据就是数据,只是factor因子化后多包涵了特性,levels而已。所以在给因子向量添加levels时候,是不显示在数据中的。直到添加真正数据,而一旦成因子再添加不存在的level的数据就会报警告被识别成NA。所以需要加入新的level,而加入新的level看着好像是加入数据,其实是level,虽然他们的值相等。加入level为:newf<-factor(原向量, levels=c(a,b,c))像这样加入新的level值,才能用newf[3]<-数据。 这种给值改数据。
46、即使是向量你认为只有20这么长,但是使用f[21]<-数据 那么就可以得到数据的增长。没有问题的,前提是有个f已经存在了。那么输入f[23]的数据,此时22处的数据就默认是NA了。长度是23.
47、tapply(x, f, g)用于针对某个因子对某个数据集合进行某种函数的操作,所以可以看到是三个元素。数据集合(数据框中的一组向量!!!不能是数据框本身,例如对工资统计平均值。只能是工资数据。因子为年龄和性别两个即可。),因子列表,函数g
其中x的向量的元素个数要与f因子向量的元素个数相同。因为按照因子向量分配的,不能x样本中有逃离在f因子level之外的吧。当然因子可以是两个因子。使用list(因子1,因子2)
tapply的核心是将数据按照因子分成不同的数据组,然后对每组使用指定函数。
并且f这个值可以是list例如:list(c(1,2,3),c(a,b,c))就是说按照两种因子进行分类,就类似与按照年龄和性别分别对工资归类。!!并不是单纯地当成123abc 这样6个等效的向量。是两个分类标准因子。
48、而split是只做tapply的分组步骤,就是分类使用的。但是split(x,f)中x可以是数据框。split返回的值是列表类型。因为tapply是使用函数计算,所以返回的是值。
49、排列文本,那么使用split(1:length(x), x) x是一个列表时候,即将顺序数字按照x的因子类型分类,这样就将txt文本内容按照相同值将其位置归纳到结果的同一个list元素中了。
50、将数据框数据变为向量来处理,为:ee<-as.matrix(x) dd<-as.vector(ee)即可。
51、by函数与tapply函数是类似的,区别在于by函数的x可以是任何类型,不再是一个向量的约束了。
52、lm()函数是组线性liner model 就是这种线性拟合的,对两列值得出线性表达式的参数值。例如:lm(a~b) 就是对a=kb+c进行拟合。
53、table函数适用于统计:将每个向量都当成因子向量来分别分类,然后做成矩阵图表示发生的次数。例如:f<-list(c(1,2,3), c(a,b,c))。 table(f)表示的是把f当成因子向量进行统计,得出一个3*3统计次数的矩阵。主要用于统计发生次数。例如既是1又是a的次数1. 当然table的参数可以是数据框,毕竟list与数据框都类似。统计的类型都是单个人以行统计,就是一行是一个人的所有信息,而统计的是按照所有信息分类的人数之和。
54、说的表就是有table函数生成的,由于table函数是生成的数字,所以表就是数据矩阵或者数组,当然可以用矩阵方法提取子表了。
55、对于一个向量也可以使用table函数,将其转换为表。而tabdom(表, 个数) 表示找出表格中频数最高的几位。
56、cut用于生成因子,cut(x, b, labels=FALSE) 表示x是数据向量。b是范围集合。产生结果:表示x的值落在哪个区间。这些数结果组成的向量。
1、编程结构:
1、循环:
for(i in x)表示的意思是循环会对x向量中的每个元素进行一次迭代。i会取遍 x[1] x[2]等
R语言中没有分号,就是一行一个计算。但是有大括号。 也有while repeat break都可以使用。repeat{ i<i+4 if(i>10) break}
当然有自己独特的next .用于类似continue,就是此次for循环next下面的后面的都不再执行重新下一次for循环。
2、scan()函数中填入文件名。只能填入文件名字。
3、但是很明显,R不支持非向量集合的循环,但是有些间接方法。例如lapply可以对每个列进行。
get函数,get接受的参数是非向量集合组成的字符串参数,例如get(c("fei1","fei2"))
4、if else即使只有一句话,也要写大括号,而且判断语句只能是逻辑值不能是逻辑向量!!!!
5、标量的逻辑与 或 向量的逻辑与 或 是不同的,前者是双个&&,或者是单个。且结果前者是值后者是向量。
6、返回值有多个的情况,可以将结果加在list中返回。
7、t<-function(x) return (x^2)
return t
这个返回值就是返回一个函数。。。所以返回值类型有好多的。
8、函数都是对象。 而函数范围很广,{都可以看成函数,,作用是将几个句子组织成一个单元。函数定义的两个参数可以铜鼓formals()和body函数得到,第一个得到参数,第二个得到函数体。g<-function(x){} 那么就是formals(g) body(g)
9、当要查看的函数之类很长时候可以使用page(abline)使用页看。
10、改变函数主体使用body(g)<-quote(2*x+3)如果少了quote这种带call性质的引用,那么就会出现g直接是一个值而不是一个函数。。
11、ls()函数会打印出目前环境下所有的变量,对象。还有ls.str()表示目前环境下对象的详细内容。
12、找函数的运行范围,是从近处开始,然后往外围上层找。
13、print(ls (envir=parent.frame(n=1))) 表示为当前环境网上升一级。
14、与c语言一样,函数不会修改非局部变量。总是拷贝一份然后执行。原来的并不改变。只有superassignment opertator这个超赋值运算符才可以。<<- 和assign()才能在局部变量处对非局部变量进行修改。但是<<-和assign只是标识要对调用上一层进行赋值并不是一定到最顶层!!!
15、showframe()就是函数带一个参数,代表调试时候想看上几级的变量内容,里面数字是几就是往上几层的框架 数目。showframe()其实就是调用的parent.frame()这个函数,而且,ls(envir=env)表示指定特定的层次的调用。
16、R中没有指针体现在x<-c(3,2,4)那么执行sort(x)后出现的是一个值但是并没有改变x的值,x仍然是原值,但是python就可以改变。。。只能重新给x赋值为:x<sort(x) 如果输出包含很多变量,那么怎么办呢?只能用list来做变量,然后传输list即可。
17、一个函数中定义f<-function(u){u<<-u*2}
那么当x<-2 f(x)时候只是将x这个值传进去,当然计算的是u=4并不是x=4.所以不论传进去的是什么,都是一个值,不是一个变量!!!!!然后会在调用f的上层环境中多出一个u=4的值,而不是变量x。
18、再次强调x[-1]出现负号表示的是将第几个值扔掉!!!!
所以quicksort自己用R编程,当然可以直接用sort就是快排。
qs<-function(x){
if(length(x)<=1) return ( x) 注意同样是相等用==两个等号这种来判断!!!!
19、是挺厉害的,可以自己定义类,然后类内部自己重新定义常规的"[."和"[<-"这两个操作。是"[.newclass"<-function(){}操作和 "[<-.newclass"<-function(){}。
20、将自己的文本后缀是.R 的代码加入是:source(xxx.R)即可。 如果想单纯修改下已经在环境中的f1()函数,或许edit(f1)会单独有个框修改,不影响目前。或者想拷贝一份再修改,那么更要用edit为:f1<-edit(f2)即可。
21、创建自己的二元运算符,例如: "%a2b%"<-function(a,b) return (a+2*b)
那么就可以使用:3 %a2b% 5 结果是:13
22、f<-function(x) return(x+2) 这个过程是先定义一个函数,function定义的,然后把这个函数赋值给f,注意f叫做函数名,而return(x+2)并不是返回给f,而是将function(x) return(x+2)整个无名称函数给了f,这样自己使用时候用f(2)这样就是调用f函数名。而在apply函数中直接调用function(x) return(x+2)例如:apply(x, 1, function(x)return(x+2))就是匿名函数的用法。而apply(x, 1,f)就是非匿名函数的用法。因为apply的第三个参数必须是函数,所以使用匿名或者有名的都行。其实function(x) return (x+2)有没有return都一样的,因为仅仅一个表达式就能返回,自带返回函数。所以不带return就行,并且赋予f的是一个函数,并不是x+2而是整个函数形式。即function(x) x+2 才是完全的f.
一、数学运算和模拟
1、exp()是以e为底的指数函数。 log()自然对数。log10()以10为底的对数,sqrt()平方根函数 abs()绝对值。sin cos
min() max() which.min() which.max()表示最大最小的位置索引。pmax() pmin()比较所有等长向量中位置在k处的最大值或者最小值。sum() prod()是求向量和和求向量积。cumsum() cumprod()表示对一个向量前k个元素进行求和和求积,是分别计算k从1到length(x)的方法.例如x向量有10个元素,那么给出10个结果。。round() floor() ceiling()分别是四舍五入, 向上取整,向下取整。 factorial()是阶乘。
在求向量的最小最大值后,还有nlm() optim()来得到函数的最小值和最大值。但是需要给函数先设定一个初始值,这样nlm或者optim才可以进行收敛得到。
微分积分:
derivative 和integrate()
D(expression(exp(x^2)),"x") 表示是e的x^2次方进行对x进行求导。即表达式和求导对象
integrate(function(x) x^2, 0, 1) //默认是对x进行求积分。表示对x^2这个表达式进行从0到1的积分。
上述两者区别是式子分别用expression和function表达。
其中R的odesolve包提供处理微积分函数,而ryacas包提供了R与yacas符号系统的接口
2、统计分布函数
函数名有一套统一的前缀名字。
d表示概率密度函数
p对应累计分布函数
q代表分布的分位数。
r是随机数生成函数
然后常规分布函数名称: norm()正态分布, chisq()卡方分布 , binom()二项分布
上面的四个前缀都可以与这些分布函数名字随机组合
模拟生成1000个*度为2的卡方随机变量,再求其平均值
mean(rchisq(1000,df=2))
这个rchisq表示从卡方随机分布中随机生成1000个数,这些带有前缀R打头的分布函数第一个参数是个数,后面就是自己所属的分布族自身带有的参数了。例如df是卡方分布的参数表示*度。
想查询使用 ?rchisq即可。
3、sort()排序但是不改变原值。order()
对数据框进行排序,是:order(list&one)然后将得到的位置当成行位置指导 list[order(list&one),]表示的就是以one列进行的排序方式将每一行重新排序。
rank()还能得到每个元素的排序大小,表示按照从小到大在整个向量中处于第几位。而同样大小的,分列3,4位,那么结果就是分别排位值为3.5都是相等的。
4、向量和矩阵的线性代数运算
普通向量与标量相乘是*即可。但是如果想计算两个向量的内积。使用crossprod(x, y)函数即可。
矩阵乘法是:%*%而不是*
solve()函数求解线性方程,即将线性方程先用矩阵将其表示出来,然后solve(x,y) x表示等号左边。y表示右边值。而只加入一个参数的solve是用于求解矩阵的逆矩阵。
关于矩阵的计算还有很多函数,但是自己已经忘记了好多。t() qr() chol() det() eign() diag()//该函数有两用性 sweep()
其中扩展的示例:向量的叉积。则很好。行列式是一个与矩阵类型相关的函数,所以说行列式是用一个复杂函数计算得到一个值的过程。记住三维的行列式计算就可以了。其实是个迭代的过程,-1的k次方再乘以子矩阵的行列式det(子行列式)
只有方阵才有特征值,和特征向量,要不然不能匹配个数:特征空间包含所有的特征值。虽然说的是矩阵,但是核心是拉缩向量,但是特征值和特征向量就是从矩阵得到的,虽然叫矩阵的特征值特征向量其实这两个值就是为了总结矩阵的。
Ax=入x 其中入是一个数值,x是一个向量,列类型,那么为了元素个数匹配,那么只能A为方阵与x相乘,然后得到一列值。
矩阵乘以向量的作用就是对向量进行的一个拉伸或者扭转的结果。。是以向量为核心的,这才是矩阵的意义(例如矩阵乘以一个向量后变成另一个向量。)。而特征值和特征向量是找出能让该矩阵只拉伸的向量(就是特征向量),且其拉伸程度!!!!程度就是特征值,。一个矩阵的一组特征向量是一组正交向量(什么是正交向量),正交向量是指两两正交。而正交是向量相互垂直,判断方法是:
向量的内积也叫点积意义是:正交是内积。不是叉积。正交表示两个向量垂直。
向量的叉积:就是使用行列式方法的乘积。两个三维向量的叉积结果是新的三维向量
5、集合运算。
求并集union() intersect表示交集。setdiff()表示差集,谁在前表示以谁为主,在前面参数中不在后面参数中。setequal(x,y) 检测集合x和y是否相等。
c %in% y 不是函数,是判断元素c是否在y中,返回一个布尔变量结果。
自己定义函数时候,长名字使用双引号添加!!!"长名字"<-
combn()函数用于一个向量产生指定个数的所有向量集合,产生的结果是按列组成的矩阵。combn(1:3, 2) 也可以指定一个函数对于得出的子向量集合进行操作。combn(x, 2, sum)对每个结果进行求和。
6、x<-rbinom(10000,5,0.5)即一个二项分布(n次独立实验),每次结果只有两种可能,并且产生的是x值是每5次结果中正面朝上的次数。。所以找到x向量中大于4的次数。求平均值就是硬币四次都是朝上的概率。函数生成的是随机变量结果集合。
虽然好多概率可以用公式计算,但是R还可以模拟,做百万次模拟得到结果。这个很厉害的。
一、类
1、R中从数字,字符串,矩阵都是对象,是类的实例化。R支持封装(是把数据封装为一个类实例。),多态,继承。
S3是原始的类结构。一个s3类是包含一个list并且有类名属性,和dispatch调度(调度功能使泛型函数成为可能)。什么是泛型函数?就是含有多态的函数都叫做泛型函数。
例如print()函数。如果识别出来对象是lm类型类,那么调用的实际是print.lm()函数。
unclass(函数)是表明,去除函数的类声明,显示出核心输出部分,手册看的更清晰一些。
methods()里面放泛型函数可以显示出来真实包含的所有实现方法,例如print可以显示n多,print.acf* ....等。但是对于print.aspell*这种带星号的是不能显示出来的,即只能使用aspell让系统默认调用print.aspell但是如果自己显式调用的话,print.aspell会报错找不到,那么就只能使用getAnywhere(print.aspell)找到。
读写:
scan是只识别空白符号,而且只能识别为数字或者字符二选一。所以这些限制着不能读成数据框形式。
read.table却是可以读成数据框形式,要变矩阵使用as.matrix变化。或者使用scan读成向量再把向量切割成matrix。
read.table一定是可以根据空格和回车来识别文件。
c<-file("1.txt","r")
readLines(c, n=1)注意,是遇到EOF停止,但是可以读取空的行,并不会忽略空的行。
close(c)表示关闭。
人口普查,可以提取某个数据量组成数据框。很方便。
提取字符串方法:substr(s, 起始数字,结束数字)然后再使用as.integer(sbustr())结果,表示是数值。
都到这时候了list还不清楚?list(gender=c(1,2),age=c(15,16))然后names(list)
1、还是要实践,例如矩阵,数据框类型就可以rbind cbind等函数,而向量,list只能使用list$xx <-数 或者 NULL 等函数。而且list的索引是数字或者[[加引号的名字]] 而由于向量是连续的!!!所以不能使用添加删除,只能 重造,c<-c(c[3:4],xxx,c[5:6])这种。
所以制作数据时候,先定义数据类型再使用d<-data.frame()然后d<-rbind(d, listxxx)才行,只要保证list的个数是相同的即可。不能d<-rbind(list1,list2)这样不首先对d定义,得到的d没有作用。。因为list不能使用rbind.
2、新建时候,list使用 l<-vector(mode="list", length=5)表明是5个长度的list。使用时候,for (i in 1:5) list[[i]]<-socketconnection()
同样,写入文件,使用数据框操作或者矩阵操作,就用write.table(data.frame, "文件名")即可,如果写入矩阵那么就是需要:人为去掉矩阵的行列的头。 write.table("data.frame", "wenjianming", row.names=FALSE, col.names=FALSE) 而且stringAsFactors=FALSE是大写波浪式的。
writeLines(xxx, c)同样是内容和connection. 并且connection建立时候使用"w"然后使用close(c)关闭connection。
对文件的操作:file.info()这种可以显示文件的大小,创建时间,是否为目录等。
dir()返回一个字符向量。列出第一个参数指定目录下的所有文件名称。使用getwd就可以看见目录,然后加入dir中即可。如果里面加入recursive =TRUE那么就会出现整个目录树。
不希望scan()输出读的个数加上quiet=TRUE.
与网络连接同样需要使用socket连接。
一、
字符串操作:
grep("pattern" , 向量) 返回的是向量中能匹配pattern的索引。 nchar("字符串")返回字符串长度,注意R字符串长度没有最后结束符。past是粘贴起来几个字符串。s<-sprintf("xxx%d is %d\n", i,i*2)这种是按照格式输出到s中。substr(x, 起始位置, 终结位置)。strsplit(x ,split="-")使用字符串中已有的-来分割。regexpr("pattern", text)返回pattern在text中的起始字符第一次匹配起始字符位置。而gregexpr()与regexpr很像是返回所有匹配字符开始位置,前者是只返回第一个起始字符位置。。
grep("c.e","acxecue")像这样,只会将后面引号中当成一个向量元素,返回的也是一直是这个向量元素位置,有了就只能是1没有就是0。是以向量为单位的。
grep("pattern", xxx)这种正则表达式使用方法,当pattern是[au]时候表示字符串中有a或者u的。 pattern c.e其中.表示任意一个字符。c..e表示中间有两个任意字符。
如果想查找.句号本身,那么使用"\\."因为反斜杠自身也是元字符属性。
strsplit(向量, "." , fixed=TRUE)带上fixed=TRUE表示的是不把.当成正则表达式。看来正则表达式是默认生效不仅是在grep这个查找中生效。当然效果与使用 \\.是一样的。
当然还有个问题:paste("a", "b")是有空格的所以如果使用paste产生名字变化的pdf文件,那么会出现空格,在paste中多用seq=""来控制无空格。
另一种方法是使用sprintf()函数。只是注意,使用浮点类型时候,%g去掉了数值的多余的0.
一、绘图
最基本的plot
plot(c(),c())表示的分别是x,y轴的值组成的点。这是最简单的圆点。开始逐步加入复杂的修饰。
point character=pch 值表示不同的点形状。
plot函数是分阶段执行的,所以可以加入坐标。plot(c(-3,3),c(-3,3),type="n", xlab="x", ylab="y")
该命令只是添加坐标轴。必须xy轴坐标相同,并且这个type是n决定了不画点只画画布。这个自己写错了,是c(a,b)不是c(a:b)代表的是如果有type=n就是只画图的范围。这样就不会再提示不匹配了。当然无type=n是当成点的,并且n y x这些等号后面的值都要加双引号。
添加线条:abline() 这个函数里面是一个线例如lm(y~x)结果。按道理abline()参数是截距和斜率。但是如果判断出来是回归线,那么会将回归线的斜率截距提取出画图的。一般abline会将结果加在目前的plot图中。
lines()由于已经确定是直线,所以使用两个点向量参数(内部是x,y值)作为参数即可画出线。但是如果不想要点,只要线,那么加上type="1"
目前只能在图上加线,但是一旦重新加点plot调用就更新画布了。。。。
新增个窗口:windows() x11()
画两条线的确实是先用plot然后用lines。或者abline()此时需要注意先画范围比较广的图线,然后把小图加上,这样才不会超范围。
有增加点的,!!!points(c(),c(), pch="+") 就是添加points,添加前两个指定向量对 的。
使用text((x,y),"name")例如加标签,指定位置x,y然后加上名字。legend()加图片,可以输入quit来停止显示。
locator(1)locator(2)分别可以显示出自己鼠标点的坐标点值。2表示可以得到两个点击的坐标值。并且不用复制,只用text(locator(1),"wenzi")这样点击就能填上文字。
plot(c(-3,3),c(-2, 3))这个操作既画点也画坐标轴。自己的图发现已经不能再大了,所以需要定制图了。
也说了,想撤销最好用source(.R)方法。
定制方法:
cex=1.5这个参数可以放在text或者plot任何画图的命令中当参数。。坐标轴更长同样在命令中使用参数:ylim=c(0,90000)表示起始范围。
curve可以绘制函数中一段内容。在现有的图中想添加,那么使用curve的参数中加入add=T
确实两次调用就显示颜色重了,但是自己想专门放大。怎么办?抄人家的源代码
保存:dev.list()可以看到有几个设备。一般是一个画图的,一个标准命令的。然后显示dev.cur()看活动的是哪个。想保存谁,就dev.set(n)是设定激活目的窗口。然后dev.copy(n)就是将现在活的屏幕内容拷贝到括号内的设备中,然后关闭设备dev.off(n)关闭对应的才可以真正写入。
三维图:persp ,wireframe() cloud().
调试的时候,使用stopifnot(x>0) 与assert很像。print确实使人很烦,R包含了基本调试工具,确实,输入debug(hanshumingchneng)就出现了下次调用hanshumingcheng时候自动跳到browser这个debug环境中。还有一种是,不想函数开始就调试,而是函数大概位置,开始插入browse()这样,到了就debug,函数结束停止。两种调试方法。还有改进debug方法,就是因为每次debug完了还要undebug,很麻烦,使用debugonce()
Q是退出,然后n是在browser下与gdb一个命令。c是退出循环或者到下一个暂停点,暂停点是browse位置。并且可以browser(x>0)表示大于0是才进入调试。还有一个即使 正在调试,不用退出加break而是setBreakpoint(x.R , 28)表示对哪个文件第28行加断点,此处加断点是进入browser模式调试的。。
不想要断点了,就看在哪个函数中,然后untrace(那个函数)。
当已经崩溃的时候,可以调用traceback()函数,然后看看卡死在哪。
当有n与命令重复,那么使用print(n)来打印n的内容。
使用save保存注意要输入save(xx, file="xx")
定义函数的时候不用加括号,只是调用的时候加上参数即可。
注意每次edit编辑的时候前面一定要加上目的函数,然后最后将函数再次执行save,保存到文件中,因为edit是编辑的内存中的,编辑完并没有保存,只有赋值给自己定义的名称才有效!!!!!!!