R心得

介绍

老本行,学。

一些疑问

  • 如何画出线性分割图PDA?用R语言我是没整明白

进阶版知识:

非标准计算

  • quote是用来把后面的东西变成一个call或者一个symbol,可以日后用eval.parent进行运算

基础知识:

  • “&”和“|”作用在对象中的每一个元素上并且返回和比较次数相等长度的逻辑值;“&&”和“||”只作用在对象的第一个元素上。

  • args(mean)—快速查看mean的参数有哪些

  • example(mean)—看一个mean的实例

  • <<- 强制赋值给一个全局变量

  • ls() & ls.str() 可以查看当前工作空间中存在哪些已定义的变量和函数。ls()不会显示以"."开头的隐藏变量,可通过ls(all.names=T)强制输出所有变量

  • rm(list=ls())来删除全局所有变量———注意编程的道德规范

  • 逻辑向量进行比较,any() & all() any中有一个为真则输出真,all中全部为真则输出真, purrr包里还有个some和every

  • 想删除向量里面的na/null : v[!is.na(v) & !is.null(v)]

  • names函数可以给向量每个分量起名字

  • 欧几里得算法计算两个数的最大公约数:

    gcd <- function(a,b){
    if(b==0) return(a)
    else return(gcd(b,a%%b))
    }

  • 卸载软件包: detach(package:MASS)

  • data() 查看都有哪些内置的数据

  • near():用来对比两个近似的数是否相等。near(1/49*49,1)

  • 在赋值语句前后加上小括号,可以输出赋值内容

  • xor(): 异或. &&和 || 只比较两个向量的第一位

  • log2(),log10(): 以2和10作为底数。作者推荐用2做底数,因为interpret的时候更有利:答案每少1,变换之前的数就比原来少了一半。

  • lag(), lead(): 将数组向后和向前移动一位。多用于比较 x==lag(x)

  • cumsum, cumprod, cummin, cummax, cummean. 累积函数

  • order依次给出第几小的是第几个,sort将数据从小到大排序,rank给出第一个数是第几小的,会把NA放在最后,同样的数用均值来计算rank。min.rank对同样的数会用最小值来计算rank. 更多选项参见?rank

  • pipe: %>% 相当于「then」 放在一段语句的最后,省去了为中间变量起名的过程,大大缩短了编程时间. Pipe使用的环境不是当前环境而是新创造出来一个临时环境,所以遇到需要当前环境的函数时会产生一些问题。如果pipe的语句超过了10行或者中间有很多的输入输出,那么不建议用pipe

  • pipe的另外三种:%T>% : return the lefthand side not the righthand side. %$%: 快速从data.frame里面选出某几个变量。%<>%赋值,但是作者不建议这么做,他认为赋值作为一个很重要的过程,值得花费点时间多写几步换来更清楚的代码

  • 表示离散程度的除了sd&var,还有IQR():0.75分位数与0.25分位数的差。mad(x):1.4826*绝对中位差:用原数据减去中位数后得到的新数据的绝对值的中位数。在数据点包含outlier的时候,后两种效果更好。

  • first(), last(),nth(x,n): 取出向量中特定位置的元素

  • range()里面有一个参数finite = T 表示去掉这个向量里面的无穷再取range

  • identical():判断两个向量是否相等。注意integer和double即使数字一样结果也会返回false。所以这时候改用dplyr::near()

  • switch(status, status1 = … , status2 = … ): 可以将多个if条件放到一个框里

  • cut(aaa, 3, dig.lab = 2, ordered = TRUE): 将aaa从小到大变成三个类别,每个类别中小数点后不超过两位

  • stop(“错误信息”):在函数或者循环里加上判断错误信息的语句可以让他变得更robust。内置还有一个函数叫stopifnot()

  • 函数里面的变量可以定义成… :可以自动match多个无法被其他方式match的输入。

  • pipable function分为两类:transformation & side-effect:第二种类似于画个图或者写个文件之类的,对原文件不产生影响,那么这些函数返回值会是那个源文件。

  • R默认的数字类型是double所以要生成integer需要手动在数字后面加上L

  • is.finite/is.infinite/is.nan/is.na:判断doube类型的四大天王,其中NaN数据会对后两个函数都给出T

  • NA/NA_real/integer/character_: NA有四种类型,分别代表logical,double,integer,character.

  • purrr出了is_logical/…/atomic/list/vector: 用来修正自带is.的问题。vector可分成list和atomic。atomic可以分成numeric,logical和character.numeric可以分成double和integer. is_scalar_atomic还可以顺便检查一下长度是否为1.

  • rep(1:2,3)结果是121212. rep(1:2, each = 3)结果是111222

  • set_names()给向量起名。

  • 可以为向量添加attributes:attr(data,‘Name’)<-’…’ attributes(x)输出所有的attributes

  • factors,date-times/times, tibbles都是vector+attributes的结果

  • mean函数里面的trim参数:从排过序的原始数据中,从数据的两端分别删除floor(trim * length)个数据再进行平均值计算

  • keep/discard(logical):只保留那些True/False

  • detect/detect_index: 返回第一个True的值和第一个True的位置

  • head_while/tail_while: 从开头/结尾开始返回连续的所有True的值,如果开头/结尾就是False则返回0.

  • reduce: Reduce a list to a single value by iteratively applying a binary function

  • accumulate: Accumulate recursive folds across a list

  • broom::glance: 对一个fit作用,给出各种参数指标(精简版summary)。tidy给出系数,augment给出原数据加上残差等一系列统计指标

  • J是矩阵的subsetting ???

  • 多维正态联合分布:mvrnorm

  • 多个因子变量进行对比可以用contrasts(z)

  • substr可以取字符的首字母substr(“china”,1,1)

  • typeof比mode更新,但class返回的是当前状态下他是一个什么类型

  • sub(pattern= ‘\,’ ,replacement=’’, y) 表示将字符串y里面所有的","去掉第一个,gsub全局去掉。

  • bootstrap产生数据保存到一个list里面:f<-function(m) sapply(1:m,function(o) sample(X,replace = TRUE)) ; b<-f(1000)

  • f<-Vectorize(f) 使一个函数可以进行向量化运算

  • m<-optimize(f,interval=c(1,4),maximum=TRUE)[[2]] 给出一维函数在某段区间的最大或者最小值

  • 产生一个异质(元素类型不同)的矩阵:从一个异质的列表开始,赋予它维数。

  • 在向量中间插入数据:append(oldvec,newvalues,after=n) 表示在第n个数据后插入新的一个元素

  • 合并几组向量形成一个list:list(com1=v1,com2=v2,com3=v3) 可以用stack将全是向量的list变成一个一列的长向量

  • 从列表中移除取值为空值的元素: lst[sapply(lst,is.null)] <- NULL 赋予NULL是删除列表元素的一种方法

  • lapply与sapply都可以对列表进行操作,不同点是前者返回一个列表,而后者返回一个向量

  • 矩阵可以通过添加参数 byrow=TRUE 来使数据按行排列

  • 从矩阵中取出一行/一列矩阵:而不是取出一行数据: row<-matrix[1,drop=FALSE]

  • 若obs是一个列表的列表而不是数据框列表:Map(as.data.frame,obs)变成数据框列表. Map是对向量的操作的函数(可能list本质上是一个向量吧)

  • 反复调用一个函数用replicate

  • 删除一个包detach(‘package: …’)

  • rnorm函数中输入的是sd而不是var

  • sweep 将输入的向量减去一个统计量(可以是mean或者其他…)

  • proc.time()获取代码运行时间

  • factorial(n)返回n的阶乘

  • win.graph可以调整图片大小,但是只能在windows上面用,dev.new不限平台

  • pander 专门用来打印的?

  • seq_along() 产生对应长度的index

  • which(dis==min(dist(dat2)), arr.ind = T) 返回特定元素在矩阵中的index

  • 对于一些大数,可以先做log变换再变回去。lgamma(x)可以算log(gamma(x))

  • 返回一个向量的最大值位置,用order然后看最后一位

  • dist计算多维距离的时候,对于某一个位置如果有NA的话,会默认用其他位置距离的平均值来impute

  • 非参拟合可以用smooth.spline 报错tol的时候一般是因为x只有1个,一般来说至少有四个不同的x才可以正常运行

System.time: How to interpret the reported times user, system, and elapsed:

  • Well, clearly elapsed is the wall clock time taken to execute the function, plus some benchmarking code wrapping it

  • “User CPU time” gives the CPU time spent by the current process (i.e., the current R session)

  • “system CPU time” gives the CPU time spent by the kernel (the operating system) on behalf of the current process. The operating system is used for things like opening files, doing input or output, starting other processes, and looking at the system clock: operations that involve resources that many processes must share. Different operating systems will have different things done by the operating system.

  • 为什么有时候elapsed time远远大于其他两个之和?https://stackoverflow.com/questions/13688840/what-caused-my-elapsed-time-much-longer-than-user-time

  • 为什么有的时候user time larger than elapsed time

  • table函数等价于python里面的Counter()

methods(print) # print 本身先判断数据类型,再给出不同的print做法

如果想取出特定summary中的某一部分,可以用str先看一下structure,确定好位置之后再直接输出。

10-16 base转换

data %>%
	`colnames<-`(c("Population", "x", "y")) #Pipeline 里面改column name

当前的包安装不上的时候:

install.packages('/Users/moran/Desktop/Epi_2.33.tar.gz',repos = NULL, type="source")

tryCatch里面赋值的时候,要用<<-而不是<-

ifelse returns a value with the same shape as test

循环

  • 在使用for循环的时候,如果给output预先分配好空间的话,那么整体的运行速度会快很多,这里可以使用vector(mode = ‘logical’, length= 12).

  • 可以用函数seq_along(n)来代替 1:n 来规避n=0的时候的错误

  • 以后不要在循环里面写出c(当前,新内容)这种效率低的语法,可以先把结果存在一个list里面,然后再使用unlist,list的空间也要先赋好。purrr::flatten_dbl()更严格,如果不是一个double的list会报错。如果是字符型的,用paste(output, collapse = “”)。如果是一堆列向量,用dplyr::bind_rows(output)

  • 多多使用while语句(simulation中常用,针对循环次数不确定,但是一个标准确定的时候)。所有for都可以改成while但是不是所有while都可以改成for

  • 函数嵌套函数,apply系列的替代函数:map():list. map_lgl/int/dbl/chr 分别对应的不同数据类型

  • map+pipe时,遇到自定义函数可以用map(~lm(mpg ~ wt, data = .))来代替map(function(df) lm(mpg ~ wt, data = df))

  • 例子:models %>% map(summary) %>% map_dbl(~.$r.squared) 最后一个可以替换成 map_dbl(“r.squared”)

  • 有时候一个循环的一部分出了错,但是整个程序中那些正确的值也无法输出,这时候我们用safely()这个函数可以返回一个二维列表,第一列是result,第二列是error。如果最后输出结构太复杂可以用transpose()来修正。

  • 在我们不想知道为什么错了的时候可以用possibly(原函数, 「替」)这样的话只要报错,都用「替」来替代

  • 还有一个函数叫quietly(): 跟safely差不多,输出的结果更简单清晰。

  • 当我们迭代的变量大于一个的时候,用pmap()。两个的时候是map2()

  • 当我们迭代的是函数而不是变量的时候:invoke_map(f, parameter)

  • walk/walk2/pwalk:call a function for its side effect rather that its return value.

  • .Last.value 最近的一个计算结果

  • source("") 可以读取文本文件(.R后缀的文件)并执行其内容 可选参数:echo=TRUE ——在执行的同时显示源代码

  • print(pi,digits=4) / cat(format(pi,digits=4),"\n") 可以改变输出数据的位数,format是用来设定数据的格式

  • cat("…",file=“filename”) 来使输出结果到filename的文件里,不过如果反复使用,要加append=TRUE。改进则要使用到文件的链接,且无需append=TRUE: con<-file("…",“w”) cat(data,file=con)

  • list.files() 显示当前工作目录里面的文件

  • save(data,file=“filename”) 存为一个二进制文件

  • dput(data,file=“filename”) 存为一个ASCII码文件,操作是将该数据以structure函数的方式打印,直接拷贝再赋值给其他变量即可,reproduce the data。

  • dump(“data”,file=“filename”) 与dput效果一样,只是多了一组引号

  • next = continue break = break

画图:

  • plot(cex=0.2) 调整数据点大小
  • 一个例子:curve(sin(x),from=-10,to=10,ylim=c(-2,2),main=“函数sin(x)”,col=“red”,lty=3,lwd=2,ylab=“y轴sin(x)”)
    abline(h=1);abline(h=-1)
  • hist(freq=F)输出density密度 freq=T 输出frequency频数
  • chull画凸形
  • 将图片和文字打印到pdf里:pdf(‘file’); plot(…) ; gridExtra::grid.table(data.frame); dev.off()
  • plot.new() 打印空白图片

16进制颜色介绍

将数字转成16进制可以用as.hexmode()这个函数,R=G=B这个颜色将是黑(0)灰白(255)

HTML文件中的颜色

corrplot

guides(fill = guide_legend(reverse = TRUE)) # 翻转legend顺序 离散
guides(colour = guide_legend(reverse=T)) # 翻转legend顺序 连续

如何在打印table并且加上title和footnote?

# 想以一个data.frame的每一列为变量画图,想加图例(并且调整图例的顺序)
df <- data.frame(x1 = rnorm(100),x2 = rnorm(100)-0.5, x3 = rnorm(100)+0.5)

ggplot(df)+
  geom_density(aes(x = x1, fill = 'liu'),alpha = 0.2)+
  geom_density(aes(x = x2, fill = 'yu'),alpha = 0.2)+
  geom_density(aes(x = x3, fill = 'meng'),alpha = 0.2)+
  scale_fill_manual(yumeng,values=c(liu="red", yu="blue", meng="purple"), breaks = c('liu', 'yu', 'meng'))# breaks用来调整图例的顺序
  • rug 在基本图中添加数据点所对应的横纵坐标小竖线

  • geom_bar + errorbar 想画横线在上下:如何对齐 如何加横线

保存ps半透明图片

library(scales)
show_col(hue_pal()(2)) #可以查看R默认前两种颜色的16进制表示

mosaic::plotModel Francisco用这个画出了很好看的图

GGplot:

分为七个主要部分:dataset, a geom, a set of mappings, a stat, a position adjustment, a coordinate system, and a faceting scheme.

  • ggplot(data=):负责创建坐标系,之后的图会贴在上面。
  • aes()里面的可调参数有x, y, color, alpha(color的黑白版), size(单位mm), shape(一个图最多6个,共有0-24种), group(单纯的分组而不加区别)
  • 如果不是想按照某个变量来分组,而是想对所有数据进行统一操作,需要将命令放在aes外面,整个函数里面。
  • stroke=num: 点的边界宽度
  • 注意连接函数的加号不能放在新一行的开头,要放在旧一行的结尾
  • facet_wrap(~class, nrow=) 将原有的plot根据class来分成小图
  • facet_grid(A~B) 将原有的plot根据AB来分成行列小图(A可以为.)这样就变成了nrow=1的facet_wrap
  • show.legend=FALSE 放在整个函数里面,隐藏图例
  • 可以将geom的函数共同的mapping挪到ggplot函数里面,也可以在随后的函数中重新定义mapping(改变setting)甚至是data(取子集)来覆盖或者增添条件。
  • coord_flip()坐标系转置(常用于转置箱型图以及处理x名字过长)
  • coord_quickmap()自动选择x-y的合适比例
  • coord_polar()极坐标
  • labs(x=, y=, title=, subtitle=, caption=(底注)) 添加注释,只要是一切能改的
  • 如果想打印数学符号,可以用quote(),更多数学语言的包尽在plotmath
  • count(data,cut_width(num)): 把关于连续变量的密度图以特定宽度统计个数, cut_number则是以特定数据量进行划分。
  • coord_cartesian(ylim=c(0,50)): 在画条形图的时候有的x观测量相对之下超小,在图上难以观察,于是用这个函数可以将很矮小的条拉起来。
  • 改变图例的展示方式:guides/guide_legend/guide_colourbar
  • 有时候我们对数据进行log变换,但是这样的话axes就变得不好解释,所以我们可以选择对x和y轴的scale进行变换:scale_x_log10()
  • theme(legend.position = “none”) 将图例去掉,分散在图中。一般来说position可以取left/right/top/bottom。还有很多其他的theme比如theme_bw(background-white)
  • colorbrewer这个包针对色盲人群做了优化
  • 如果想对固定颜色种类:scale_colour_manual(values = c(Republican = “red”, Democratic = “blue”))
  • scale_color_x / scale_fill_x(x还可以特别设为gradient/gradient2/viridis)
  • ggsave可以保存最近的一张图片,但是大小尺寸都是根据当前窗口自适应的,不是很reproducible,所以我们最好自己固定尺寸
  • 如果想画多个图在一个画板上。将每一个ggplot保存成p1-p4. gridExtra::grid.arrange(p1, p2, p3, p4, ncol=2)
  • 如果想用颜色区分多条线并且加图例:aes(x=x,y=y3,color = ‘y3’)
  • 想自定义颜色的话:scale_colour_manual( values=c(‘springgreen4’, ‘tomato3’, ‘lightskyblue’,‘orange’))
linetype="dotted" #可以决定线的形状
annotate("text", x = 7.5, y = 0.9, label = "ratio = 96%") # 在图中标记注释
theme(panel.background = element_rect(fill = 'blue4'), panel.grid.major =element_blank(), panel.grid.minor = element_blank()) #可以改变背景色+网格

更改theme 比如说字体方向等…

scale_fill_discrete(name = "Group Mean") #更改legend title
scale_x_discrete(limits=c(8,4,6)) # 可以改变X轴顺序

ggpubr

theme(axis.text=element_text(size=12),
        axis.title=element_text(size=20)) # 调大坐标轴字体
facet_wrap(~variable,ncol=4,scales="free")+ # 根据variable直接画出多个图而不用grid.arrange
  theme(strip.text.x = element_text(size = 30)) # 调整facet_wrap的变量字体

Stat_compare_mean如何只画出来显著的变量

geom系的函数:

  • geom_smooth() 拟合图,method中可选lm, glm, loess… aes中可选linetype=class 来对不同的class进行分别拟合. se=T/F来控制是否画出线周围的灰色置信区域。span越大,拟合图就越光滑
  • geom_bar()个数柱状图, 可以修改stat=选择其他统计量.bar函数默认的stat是count,同样的,stat_count函数的默认geom也是bar,这种情况下,可以用stat_count来代替geom_bar。color选择外框颜色,fill选择填充颜色(可以等于其他变量,画出分层色彩的柱状图。也可以等于NA,就是不涂色)。Plot Group Mean
  • bar中position=(identity:每种类别都画出具体位置,但比如有的最小值小于其他的最大值,就会导致重叠的问题。fill:将所有集合都变成高度1,然后内部填充颜色,有助于比较不同集合之间的成分比例。dodge:每个集合都是好几个小柱状图,解决了重叠的问题。Jitter:给每个数据点加一个小随机误差,解决over-plotting问题)
  • stat_summary()对于每种类别画出一条垂直的竖线,两个端点和中间一个黑点代表着最大值最小值和中位数/均值
  • geom_jitter()等同于geom_point(position=‘jitter’)
  • geom_count也是来解决over-plotting的,把数据重合点用一个更大的点来表示。也用来画出两个因子变量的联合图
  • geom_freqpoly(): 另一种密度图像,用线来代替条形。有时候各个类别的个数相差很多,而如果我们想看类别内的分布情况,需要标准化,在ggplot主函数的mapping中令aes(x=price,y=…density…)这样每条线下面的面积都是1
  • geom_boxplot():对于无序的变量,可以用reorder(x,y,FUN=median)来根据中位数从左至右排序,varwidth=T用来使每个箱型图的宽度与数据量成正比 如何加outlier的label
  • geom_tile(mapping=aes(fill=n)) 为count填色
  • geom_bin2d geom_hex 都是对两个连续变量画出分块密度图。前者是方形,后者是六边形(需要安装包hexbin)。
  • geom_ref_line(h = ?): 添加一条白色指示线
  • geom_text()是geom_point的扩展板,带个label可以在点附近写东西
  • geom_label(nudge_y=?)将geom_text里面的文字外面套了一个矩形框,可以将矩形框上移?个单位
  • 但是以上两种geom都解决不了重叠的问题,这时候就要用到ggrepel::geom_label_repel 再配合一下给对应的点圈出来,就很清晰了
  • geom_rect(xmin,xmax,ymin,ymax): 框住兴趣点
  • geom_segment(x,y,xend,yend): 画一个箭头
  • scale_name-of-the-aesthetic_name-of-the-scale: scale一般都会默认选,除非要改变default。scale里面两个重要的参数breaks=和labels = NULL对axes进行操作
  • geom_vline(): 添加一条竖线
  • geom_errorbar(aes(ymin=len, ymax=len+sd), width=.2, position=position_dodge(.9)) 柱状图中画出置信区间

如何画出灰色图片

geom_bar画出groupmean

ggpubr

ggboxplot(data = dat_tmp,x = ‘X’, y = ‘Y’, color = ‘X’, palette = ‘set1’, add = “jitter”,outlier.shape = NA)

  • Add = jitter 可以画出所有点
  • 但是有了add = jitter之后 离群的点会出现两次,outlier.shape = NA 可以只显示一次

数据基本处理:

  • as_tibble(): 将data.frame变成tibble

  • tibble(x=…, y=…, z=…):直接生成tibble

  • print(tibble, width = Inf)这样在打印的时候会把所有列都打出来

  • tribble:复杂一点但是易读懂的tibble生成方式。x,y,~z ‘a’,2,3,‘b’,4,5…

  • 取某一列的时候可以用$也可以用[]来取出tibble, [[]]来取出数据。如果用pipe方式的话需要加一个点。data %>% .$x

  • enframe(): 将一个列变量变成一个两列的tibble,有名字的话名字变成第一列,没有的话将第二列复制一遍放在第一列

  • deframe(): 干的事情和enframe相反,讲一个两列的tibble变成一个向量,第一列被当成名字

  • data <- read.table("",sep="\t",header=T,fileEncoding=“UCS-2LE”) 把数据从excel里面拷到txt必须这么输入,要不然会有隐藏字符看不到

  • read.table() 参数:stringAsFactor=F 不将字符转化为因子 na.strings="." 缺失值在这组数据中以"."来标记 注意read.table默认header=F

  • scan(“filename”,what=list(data=character(0),high=numeric(0)))

    其他参数: n=number nlines=number skip=number na.strings=list 分别表示读取number个数据后停止,读取number行后停止,先跳过number行在读取,将list中的字符串解释为na。scan可以从网页中读取数据

  • load(‘file’)从本地读进去一个数据。一般都是以.Rdata结尾。.Rdata也是save语句的默认格式

tally 统计group mean

  • psych::describe 是一个比summary更详细的方法

tidyr

  • gather(xxx, key = ‘a’, value = ‘b’): 如果在tibble的第一行存在一些数据而非数据名(就像2*2联表中的列那样),那么我们就把这些数据放在xxx的位置,为他们产生一个新变量叫做a,而原本的数据框里面的数据也有了一个新的名字叫做b,这样就把这些数据所在的列变成了两列,a和b。可以添加na.rm=T参数
  • spread(data, key = ‘a’, value = ‘b’): 针对有些时候某一列a中包含的都是变量名,而b列分别存了这些变量的值,所以我们只用这两个参数就可以把数据清洗干净。
  • separate(data, col1, into = c(‘col2’, ‘col3’), sep = ‘/’): 若有一列中包含了两列的数据,并且用’/'字符分隔的,那么我们可以用这个函数将col1分成col2和col3. 如果我们不确定是怎么分割的,可以将sep换成convert = TRUE,我们还可以给sep附一个数字向量,他会在对应的位置进行分割
  • unite(colnew, col1, col2, sep=’’): 将原来的col1和col2合并成colnew
  • complete(data,col1,col2): 将col1和col2的所有组合都检查一遍,如果没有的就添加成NA
  • fill(data, col): 有时候的NA出现是因为想表示这些空的数据跟上面的数据一样,所以就不用再写一遍了。这时候我们可以用fill来告诉计算机col列所有的NA都用在它上面离它最近的数据填充

readr

  • read_csv():逗号分隔。read_csv2():分号分隔。read_tsv():tab分隔。read_delim():不管什么分隔都ok。read_fwf():固定宽度文件(可用里面的参数fwf_widths()来固定宽度,或fwf_positions()来确定位置)read_table():列和列之间用空格分隔。read_log():apache style还不懂这是什么
  • read_csv: 默认是把第一行作为列名,所以如果我们不想要开始的n行:skip=n, 我们不想要开头带井号的行:comment=’#’,或者直接这些数据都没有名字:col_names=F. 或者可以col_names=c(…)来创建新的名字. na=’'告诉计算机这个文件中na是以什么方式存下来的。
  • parse_*(): *可以为logical, integer, double, number, character , factor, datetime, time, date : 将输入的字符转换成其他格式,如果有错的话,可以用problem()来查看为何出错
  • 对于number来说,各个国家地区的书写方式不同,如果小数点不是.而是’,’ 那么我们可以在最后加上,locale = locale(decimal_mark = ‘,’) 同时parse_number()这个函数忽略掉数字前和后的字符,所以如果是123.45,点之后的45会被忽略掉,读成123. 而$100也会读成100. 最后,如果是像美国这种每三个数字就加一个逗号的问题,number可以解决,而对于除了逗号其他的组间分隔符,要用parse_number(’…’, locale = locale(grouping_mark = ‘?’))
  • 对于strings来说,问题就只有编码的不同产生的问题。现在大家都用UTF-8,但是一些老文件可能不是。所以如果我们知道这些字符的编码,可以用parse_character(… , locale = locale(encoding = ‘某种编码’)) 如果我们不知道编码的话,可以用内置函数来猜。guess_encoding(charToRaw(‘char’)) 其中charToRaw是将char变成源代码。当然大部分情况下他们也猜不准,除非数据量很大。
  • 关于时间。date返回从1970-1-1以来的天数。date-time返回从1970-1-1以来的秒数。time返回从前一天晚上12点到现在的秒数. date-time接受八位加T加六位的字符。date接受八位,time接受六位。(都是默认,可以根据情况不同而有所调整)。关于时间还有很多灵活地参数表示,这里先不说了…R4ds书上P135有说到。
  • guess_parser()来猜测某个字符是什么类型。parse_guess()用猜测的类型进行parse
  • readr工作的时候会选取前1000列来guess(代码中guess_max=1000),再用guess的结果进行parse,但有时候前1000行不具有代表性,所以问题就来了,这时候我们可以用problems(x)或者stop_for_problems(x)进行查验,并对col_types = cols(x=col_double()…) 放入readr中重新读。因为readr只查前1000,我们也可以用tail(data)来检验一下最后的几条数据看看是否符合预期。有时我们也用col_types = cols(.default = col_character()) 全部读成character,再用type_convert进行修正。
  • 写出函数:write_csv(), write_tsv(). 默认采用UTF-8编码。如果我们想输出一个CSV文件给excel 可以用write_excel_csv()会在文件的开头告诉excel我们是用UTF-8进行编码的。但是以上类型会在有NA的时候出一些小问题。这里我们引入一种专为R应用的函数write_rds()&read_rds(),文件也要以rds为后缀。还有一种方法是所有编程语言通用的feather格式。write_feather()和read_feather()同样需要后缀为feather.
  • 其他格式:haven:读spss和sas文件。readxl:读xls和xlsx文件。DBI(以及RMySQL,RSQLite,RPostgreSQL)可以对数据跑SQL语句并且返回一个data.frame. jsonlite: for JSON. xml2: for XML
  • readfwf :像SAS一样按照固定的格式读取文件:fixed with format

##dplyr:

  • tibbles格式是一种特殊的data.frame(四种基本格式:int整数,dbl实数,chr字符,dttm日期加时间,lgl逻辑,fctr类别,date日期)
  • between(x,left,right): 判断x是否大于等于left小于等于right,返回逻辑值
  • rename(data, new_name=old_name) : 对列改名
  • inner_join对于key只在x或者y的数据予以删除。outerjoin中left_join保留x中所有,right_join保留y中所有,full_join保留全部。
  • 对于left_join.如果key是一对一,一对多,多对一都ok。但是如果是多对多的时候,会产生笛卡尔积。
  • left_join选择key的方式,默认是by = NULL 即对xy所有重合的列名进行join,第二种by=c(‘col’)根据选定的key进行join,第三种by=c(‘a’=‘b’)对于x中的a和y中的b进行比较。
  • merge(x,y, all.x = T, all.y = T)和join系列效果一样,只不过join系列一是看得清楚,二是算得快并且不容易出错。SQL也能做,但是看不懂,先不嗦了
  • semi_join(x,y) 保留x中所有match了y的观测值。anti_join(x,y)丢掉x中所有match了y的观测值
  • intersect() ,union() ,setdiff(x,y). 最后一个函数返回x\y .集合语言可以对tibble的观测值进行作用

###六种基本函数

格式:第一个位置放置data.frame,后面的都是用不加引号的变量名对数据进行操作,最后返回一个data.frame。

  • filter():根据变量筛选观测值集合. 注意filter会自动去掉逻辑式中False和NA的观测值,如果需要保留NA,则要使用is.na() | xxx
  • arrange():将观测值以某些指标进行排列.默认升序,降序用desc(col.names). NA会被放在最后
  • select():选出特定变量. -(name1:name2) 表示去掉name1到name2中间的全部列。还可以用其他辅助函数:starts_with(‘xx’), ends_with, contains(), matches(’’)满足特定正则表达式,num_range(‘x’,1:3)选出x1,x2和x3, one_of(vars)选出字符表示的列名集合(但我发现不用one_of直接对vars进行select也OK)。式子最后加上everything():把前面选择的变量移到列的最前面,相当于不仅选出了特定变量,还补上了其他未选择的变量。如果想区分大小写,在match类函数里面添加:ignore.case=F
  • mutate():根据已有变量产生新变量. 如果只想保留新变量,使用transmute(). 将一些异常(大于0的)观测值填写成NA:mutate(y=ifelse(y>0,NA,y))
  • summarize():将多个变量浓缩成一个统计量, 常与group_by连用. 里面的函数n()返回观测值的个数,n_distinct()返回不同的观测值的个数。计数还可以用count(,wt=…)代替summarize()
  • group_by():将命令对每个分组作用, 想去掉分组用ungroup().
  • nest:常与group_by连用,在tibble里面生成小tibble.使用unnest(data, varaible) 来变回常规tibble. 还有一个用法是nest(col1:col2): 将col1到col2中间的列都捆绑起来

stringr字符

很多stringr的函数都有第二个版本_all :works with all matches

stringi包是stringr的扩充版,函数从42个增加到了234,遇到了棘手的问题可以试着从stringi中找一下,函数名称的开头也会变成stri_…

  • 有时候console里面打印出来的字符不是他本来的样子,要用writeLines()
  • r4ds作者建议用双引号来引用字符。
  • ?"’" 或者 ?’"’ 都可以来查看一系列关于各种字符的表达
  • str_length(): 求字符长度
  • str_c():combine字符,相当于paste。如果想让NA变成字符型的NA打印或者操作,使用str_replace_na(x)。把一个字符向量变成一个字符:collapse = “,”
  • str_sub(str, start, end): subsetting,注意这个str_sub不是创建了一个新的变量而是提供指针,这样的话如果你对sub之后的字符进行了修改,那么原来的字符也会被修改
  • str_to_lower()/ str_to_upper()/str_to_title: 全部变成小写/大写/首字母大写。但是不同语言的大小写可能略有不同,需要通过locale = “en” 来获得robust的结果。str_order和str_sort比起原生的排序也是多了locale可以选择。
  • str_trim(): 去掉字符开始和结尾的空格。
  • str_wrap(): 把字符变成一个格式化段落
  • str_view(x,‘match’): 用来可视化匹配结果
  • str_detect(): 判断是否匹配,返回逻辑值
  • str_count(): 返回一个数字,匹配了多少次。注意match不会重叠。str_count(“abababa”, “aba”) #> [1] 2 而不是三个
  • str_subset(): 选出匹配的字符们
  • str_extract(): 将Match的部分提取出来(默认值是第一个match的)。如果想提取出来所有的match,用str_extract_all()会返回一个列表,可以加上simplify = T 就会变成一个矩阵,宽度用NA填补成最长宽度来对齐。
  • str_match()&all: 分组匹配,返回一个矩阵。第一列是str_extract的所有组合在一起的完整内容,后面每一列是每一组分别的内容。如果数据集是一个tibble,可以用tidyr::extract(tibble, name-of-matches, matches, remove = F)来代替str_match.(remove的意思是是否删除原tibble)
  • str_replace()&all: 用给定字符替换匹配字符。可以用c(‘match1’=‘new1’,…)来建立一个多维替换。还可以用分组的方法调换位置。str_replace("([ ^ ]+) ([ ^ ]+)", “\\2 \\1”)
  • str_split(“分隔符”): 进行切割,返回一个list。可用simplify = T 来返回一个Matrix。参数n=几,可以固定最多切成几份。可用boundary(“word”)作为match来选中所有的单词而忽略标点以及空格。
  • str_locate()&all: 返回每个match的开始和结束位置

正则表达式

  • . 匹配任何字符(except a newline)但是我们如果只想匹配".“这个字符,需要变成「\\.」第一个斜杠告诉计算机我们现在是特殊字符,第二个斜杠保护了”."不会单独出现。想要match一个「\」我们需要用四个「\」
  • 锚定:"^“从字符的开始进行匹配,”$"从字符的结尾开始匹配:记忆口诀:if you begin with power (^), you end up with money ($). 如果想让正则表达式只匹配全字符,可以同时加上^和$。
  • match the boundary between words with \b
  • \d: 匹配一个数字。\s: match white space(space/tab/newline)\S:匹配所有非空白 [abc]: match a,b, or c. [ ^abc]: match anything except a,b, or c. 注意前两个带斜杠的在match的时候都需要再加一个斜杠
  • abc|xyz 可以match到"abc"或者"xyz" 复杂的式子中可以加上圆括号,例如 “gr(e|a)y” 都可以match到灰色
  • repetition:一个match可以用几次。?可以用0或1. +可以用1或更多。*可以用0或更多。还可以特意指定匹配多少个。{n}:正好n个。{n,}:n或更多。{,m}:最多m个。{n,m}:在n和m之间。(在有三个匹配项时,{2,3}最后还是会匹配三个,说明匹配的时候默认是越多越好。可以再、在最后添加一个问号"{2,3}?"来变成匹配的越少越好)
  • 可以使用斜杠来分组\1\2… 注意在匹配时还是要多加一个斜杠。
  • 再用str函数的时候,匹配的"match"其实都是regex(“match”)的缩写版。regex函数还有很多参数:ignore_case = T. multiline = T(让^和$ match每一行的开始和结束而不是整个字符的开始和结束)dotall = T (允许"." match everything including \n)
  • regex()的替代品们。fixed():能让我们告别复杂的斜杠并且算的比正则式快,只能match一模一样的,但对于一些含有音调的字母的多种表达方式可能会不识别。coll()太复杂了感觉暂时不用学。
  • apropos(‘replace’): 常用来选出带有特定字符的函数(带有replace的)
  • dir(pattern = ‘正则式’):在目录中搜索文件,返回match的文件名
  • AB*表示的是一个A加n个B,n为自然数
  • (Y|F)(.)\2:匹配Y或者F,后面跟上两个一样的字符
  • [A-T]匹配A到T,但(A-T) 匹配「A-T」
  • grep函数如果匹配不到的话,会返回长度为0的东西,可以用length()来catch

forcats因子变量

  • 创建因子变量:factor(char, levels = …) 对于不在levels里的字符会自动转成NA(对于这种情况如果需要error提示的话,可用readr::parse_factor代替factor)
  • 对于levels的顺序,默认是字母表顺序,如果想按照char本身出现的顺序来排序的话,方法1:factor(char, levels = unique(char)) 方法2: fct_inorder(factor(char))
  • 对于tibble中的因子变量,可以用count来轻松看到有哪些levels,数量各是多少。或者可用geom_bar(). 默认ggplot会将数据量为0的类别在图中删去,可以+scale_x_discrete(drop = F)来强制显示
  • modifying factor order: fct_reorder(f,x, fun) f是要修改的变量。x是一个向量,按照从小至大的顺序对f重新编排。fun:如果对于一个f有多个x跟他对应,那么默认value=median
  • fct_relevel(f, level1):将level1移到所有level最前面。
  • fct_reorder2(f, x, y): 根据x取到最大值时y的取值进行排序。(画图完interpret的时候常用)
  • fct_rev(): reverse
  • fct_infreq(): 按照频率,从大到小排序。(一般还是从小到大舒服,所以配合fct_rev使用)
  • modifying factor levels: fct_recode(f, “new”=“old”) 可以将多个old指向同一个new
  • fct_collapse(f, “new”=c(“old1”, “old2”, …)): 快速的进行多个old指向一个new的操作
  • fct_lump(): 默认会将多个迷你组合,合并成一个小组,并且保持他仍然是最小的组合。我们可以加上参数n=几,来告诉他合并之后保留几个组
  • 增加一个factor的level可以用c连接,删除的话只需要再z1INCNONW1<factor(z1INCNONW1<-factor(z1INCNONW1) 留下用到的level

lubridate时间

  • today(): 获取当前日期。now(): 获取当前日期+时间
  • 从字符或数字变成日期+时间:m/d/y + _ + h/m/s的任何一个排列组合都是一个函数。参数tz = “Timezone”
  • make_date/make_datetime(year=, month=…): 如果时间的每个部分被存在了不同地方,用这个函数。
  • as_date/as_datetime(): 在两种格式的时间中相互转换。也可以把从1970-1-1开始的天数/秒数转换成时间。
  • year/month/mday/yday/wday(time): 从一个时间变量里面抽取信息也可以进行赋值。对于month/wday 可以选择label=T返回英文,abbr=F返回全称。
  • floor/round/ceiling_date(time, “unit”): 四舍五入到最近的单位
  • 如果是对多项指标同时修改/赋值的话可以使用update(time,year=…),如果赋值超过上界,会被直接加到下一个时间单元
  • 在r中如果时间减去时间会得到一个difftime变量,但是由于时间的单位可以是秒分时天…很难处理,所以用as.duration将他变成秒。
  • duration家族还有:dseconds/dminutes/dhours/ddays/dweeks/dyears都是将对应的后缀变成秒,duration可以进行加减乘除。
  • period家族:seconds/minutes/hours/days/months/weeks/years时间单位是多种多样的,也可以加减乘除
  • intervals:(start %–% end) : 是一个有开始结束点的时间段,多用于时间段相除
  • Sys.timezone(): 查看当前时区
  • 除非特殊表明,否则lubricate采用UTC时间。想变换时区(时间会随之更改):with_tz(time, tzone = “continent/city”)。想变换时区(时间不会变):force_tz(time, tzone = “continent/city”)

modelr模型

  • data_grid():求出离散数据的自变量集合。.model可以添加模型信息
  • seq_range():求出连续数据的模拟自变量集合. pretty = T 可以使output更加好看。 trim=0.1 会把两端10%的数据去掉(总共去掉20%的数据)expend = 0.1 与trim相反,将两端拉长5%(合在一起是0.1)
  • add_predictions(data, model) 根据自变量和模型算出预测值并进行连接
  • add_residuals(data, model) 跟上一个函数同理
  • 可视化残差的方法:geom_freqpoly 或者 画散点图和 y=0进行比较
  • model_matrix 生成设计矩阵
  • 对于多个model来说 有gather_prediction/spread_prediction. 前者是多出一列mod类型(分为1和2)一列是预测值。后者直接多出来两类预测值,所以前者窄长,后者扁宽。

回归分析:

  • 如果formula里面带有加减乘除等符号,要用I()括起来
  • 再用poly的时候,有时候因为不可导会导致设计矩阵出现正负无穷。这时候用splines::ns(x, n)来代替poly(x, n)
  • 有缺失值的时候一般R都会默默地不出声自动drop掉那一行,options(na.action = na.warn) 会在drop之后给出一行warning。options(na.action = na.exclude)还原。
  • nobs(formula)可以查看某个fit到底使用了多少个观测值(number of observations)
  • 常用的模型:lm/glm/gam(generalized additive model)/penalized(glmnet)/rlm(robust)/tree
  • lm(v1~I(v2 * v3))真的是v2乘v3。但如果是lm(v1~v2 * v3)就会有v2,v3,以及v2:v3
  • rstudent 返回fit之后的残差
  • xtabs可以根据不同字符型变量组合生成01的设计矩阵
  • sigma(fit)可以返回fit的standardized residual
  • Logistic: glm(formula, family = binomial( link = ‘logit’ ))

aov函数默认给出type1,anova函数默认给出type2,type2&3可以用car::Anova(type = c(‘II’,‘III’)) 来使用

conf.int获得置信区间

poly(2, raw = T)I(x^2) 效果相同,否则poly会给出orthogonal polynomial。用orthogona的目的就是保证那些多余的项不会影响到前面的估计。

  • 即使是overfit的话,如果多余的项是orthogonal的话,也不会影响正常的估计值。所以很多时候我们喜欢orthogonal。
  • 神奇的是,是否加raw,得到的预测值相同。因为poly(2)的两列其实是poly(2, raw = T)两列的线性组合,以一种orthogonal的形式。
  • poly的算法:先使列均值为0,然后使用QR分解。为了得到y1=a1x1+a2x2,y2=b1x1+b2x2y_1 = a_1x_1+a_2x_2,y_2 = b_1x_1+b_2x_2 使得 y1y2y_1 \perp y_2。并且R的算法会使得即使你从ploy2 -> poly3,poly3的前两列仍然能和poly2保持一致。

pwr.t.test 来计算power

主成分分析

  • prcomp函数
  • biplot可以画出PCscores and loadings- 二维图只能选择前两个PC
  • pls::pcr
  • validationplot
  • princomp 可以直接给出loadings 需要用fit2$loadings[]取出matrix形式
    • 这个函数即使定义了cor = F, 也会自动中心化score矩阵
  • PCA画图很好看

时间序列

主要用的包有TSA/latticeExtra

  • lattice::xyplot 可以画出时间序列图。比plot好看一点点点
  • TSA::as.ts 将向量变成时间序列
  • xyplot(hours, panel = function(x, y, …) {panel.xyplot(x, y, …) panel.text(x = x, y = y, labels = months)}) 标出各个月份的信息
  • harmonic fit一个cosine-trend
  • densityplot&qqmath判断是否正态

Econometricians often talk about a time series being integrated with order k, I(k). k being the minimum number of differences required to obtain a stationary time series. forecast::nsdiffs() 可以做ADF test

R output 的 ma 和 ar 都是 等式右面直接的值。

tsdiag 返回更详细的诊断

Stat471

ecoreg::gauss.hermite(k) 获取g(x)的多项式分解。同样还有integrate.gh

预分配数据框——有助于提高运算速度:
N<-1000000
dfrm<- data.frame(dosage=numeric(N),lab=factor(N,levels=c(“A”,“B”)))

根据位置选择数据框的列:
dfrm[[n]]=dfrm[,n] 返回第n列
特别的,dfrm[,n,drop=FALSE] = dfrm[n] 返回一个数据框,元素为第n列
dfrm[c(n1,n2)]=dfrm[,c(n1,n2)] 返回一个数据框,元素为第n1和n2列

根据条件更便捷的选定行和列: subset(dfrm,select=c(colname1,…,colnameN))
subset(dfrm,select=c(predictor,response),subset=(response>0))

直接编辑数据框:①temp<-edit(dfrm) dfrm<-temp ② fix(dfrm)

从数据中移除包含NA值的一整行: new<-na.omit(dfrm)

根据名称排除列: subset(dfrm,select= c(-badboy,-patient.id))

根据共有列合并数据框: new<-merge(born,died,by=“name”)

对于快速一次性使用数据框内的数据,可以不用attach&detach : with(dataframe,expr)
z<-with(data,(pop-mean(pop))/sd(pop))
但注意attach之后就别对原数据进行操作了,因为无法改变原来的值。只能将值调出来赋给新的变量。

【重点】不同类型的数据转换,P156页: 首先要记住可以单独用cbind/rbind 来达到转换成行/列的效果

nls可以根据特定形式的函数进行最小二乘拟合,用coef来提取参数

mvnormalmixEM 可以计算多元正太的EM

5.5

基础篇(4)

split(列表的一行,列表的另一个用来分类的行)
unstack(data.frame(列表的一行,列表的另一个用来分类的行)) 用来对列表中向量进行分组

对列表的每一个元素进行操作:用lapply/sapply s是简化的意思
对列表的每一行进行操作:apply(list,1,f) 其中1表示行,2表示列,c(1,2)表示行和列
tapply(data,factor,fx) 对列表的某一列按照另一分组的列进行分类并操作
by(data,factor,fx) 把整个数据框按照某一分类方式进行分类并操作
mapply 将函数应用于多维向量上 mapply(gcd,c(1,2,3),c(9,6,3))

第七章:字符串和日期:

获取字符串长度: nchar()

连接字符串 paste("","",sep="")
paste(c(“a”,“b”),“c”,sep=“e”,collapse=“f”) 输出结果:[1] “aecfbec”

提取字符串: substr(string,start,end)

根据字符中有的分隔符来分割字符串: strsplit(“LOVE”,"") 可能的拓展参数 fixed=TRUE

将字符串中的某些字符替换成其他字符:
sub(old,new,string) 将string中第一个old找出来替换成new
gsub(old,new,string) 将string中所有old都替换成new

针对某些特殊字符,如"first\rsecond\n" 使用函数print和cat输出的结果是不一样的

生成两组字符串的笛卡尔积: m<-outer(strings1,strings2,paste,sep="")
此法生成一个矩阵,可用as.vector变成一个向量
用m[!lower.tri(m)]可以去掉m矩阵的下三角中所有元素 (上三角为upper.tri)

得到当前日期: Sys.Date()

将字符串转换为时间: as.Date(“12/31/2016”,format="%m/%d/%Y")

改变时间输出格式: format(Sys.Date(),format="%m/%d/%Y")

%b 缩写的月份名称 %B完整的月份名称 %d两位数字的日期 %m两位数字的月份 %y没有世纪的年份 %Y有世纪的年份

生成给定数字的时间: ISOdate(年,月,日,小时,分钟,秒) 可在外面套上一层as.Date将具体时间变成为某一天

将时间变成从1970-1-1以来的天数: julian(date)/as.integer(date)

要具体知道某一天的其他信息(如它是一年中的第几天,是个星期几…)p<-as.POSIXlt(date)
参数p$: sec,min,hour,mday(该月的天数),mon,year(from1900),wday(0~6—0为周日),yday(该年的天数),isdst(夏时令标记)

创建日期序列: seq(from=d1,to=d2,by=天数/“month”,length.out=多少天)

5.6
第八章:概率
dnorm正态密度 pnorm正态的分布函数(累计概率) qnorm正态分位数 rnorm正态分布随机数
binom二项分布 geom几何分布 hyper超几何分布 nbinom负二项分布 pois泊松分布
beta贝塔 cauchy柯西 chisq卡方 exp指数 f-F分布 gamma伽马 lnorm对数正态 logis逻辑分布 t—T分布 unif均匀分布 weibull威布尔分布 wilcox-Wilcoxon分布

combn(items,k) 从items里面抽k个出来,把所有组合排列出来

生成随机样本序列: sample(vec,n,prob=c(…))

d+分布为独立概率,q+概率能求分位数 p+分布为累计概率,在参数中添加 lower.tail=F表明求出互补概率1-P

diff(pbinom(c(3,7),size=10,prob=0.5)) 可以求出在3~7之间的概率 但diff并不是绝对值

polygon(region.x, region.y, density=) 可以为图形填充阴影

第九章:统计概论

统计惯例:选择显著水平α=0.05 则计算出p值小于0.05拒绝原假设,p>0.05不拒绝

summary不提供关于数据波动方面的信息,所以要自己加上sd()等

计算相对频数:mean(逻辑判别式) 如:mean(x>0) 此法也可用来求逆分位数

table(f1,f2) 将数据按照f1,f2的因子类进行计数,形成一个列联表

检验分类变量的独立性: summary(table()) 观察结果中的p值

为了保证一个有意义的置信区间或者是T检验,在数据<30个的时候要保证数据是服从正态分布的

中位数的置信区间: wilcox.test(x,conf.int=T)

问题:有一组数据由失败与成功构成,你认为成功的比例是p,你需要用样本数据来检验
prop.test(x,n,p,alternative=“greater/less/two.sided”) 记得要将想证明的结论放在对立假设
prop.test(x,n)可以输出一个比例的置信区间

游程检验——一个序列是否是随机的:
library(tseries)
runs.test(as.factor())

比较两组样本的均值: t.test(x,y,paired=, var.equal= )

两个总体具有相同的图形形状,但他们的均值是否相同呢?:wilcox.test(x,y,paired=)

检验相关系数的显著性: cor.test(x,y) 对于非正态总体: cor.test(x,y,method=“Spearman”)

两组数据都由成功/失败组成,我想知道这两组是否具有相同的成功比例:prop.test(每一组的成功个数,每一组的总数)

把一些样本的均值与其他任何一个样本的均值进行比较:pairwise.t.test(data,factor)

两个样本是否取自同一个分布?: ks.test(x,y)

17.11.7
grep(pattern = “j”, x = a, ignore.case=F, value = TRUE)取出特定字符,ignorecase表明去不区分大小写,value意思是输出字符还是输出字符的位置
sub(pattern = “e”, replacement = “E”, x = a)只替换每个字符第一个出现的位置 gsub替换所有
coef(summary(lm))也是一种输出系数的方法
lm(xx0+yy,data=?)/lm(xxyy-1,data=?) 不要截距
lm(xx~(.-1),data=?) 彻底不要截距 (.-x)去掉x之外其他的进行拟合

ggplot:
ggplot之后是什么也没有的,需要通过+geom_bar()等一系列来输出
例子①ggplot(mpg, aes(cty, hwy)) +geom_point(aes(color = drv, size=cyl), shape=19, alpha=0.5)
例子②ggplot(a,aes(carb,optden))+geom_point()+geom_smooth(method=lm)

多项式线性拟合 ~poly(x,n)
confint(lm,level=0.95)给出置信区间
model.tables(av1, type=“means”) 可以给出aov()各个分类的均值(默认的是给出系数)
xtabs(~ wool + tension, warpbreaks) 给出wool和tension每个类别都有多少个观测值
model.matrix输出设计矩阵
invisible(capture.output(y <- ff(2))) 可以隐藏赋值语句中自带的print
reformulate(paste(“X”, 1:p, sep=""), “Y”) 可以自动输出线性回归的格式:Y~X1+…+Xp
faraway包里面有Cpplot
leaps包里有leap,可以算Mallow’s Cp

fit1<-rpart(lowbwt~.,data=test0,parms=list(split=“information”,
loss=matrix(c(0,1,5,0),byrow=TRUE,nrow=2))) 可以用来在rpart里面添加misclassification cost

R-Markdown:

  • 一个星号包围是斜体,两个星号包围是粗体,code是用斜点包围
  • 上标用^包围,下标用~包围
  • 无序列表使用一个星号加两个tab,子列表分别在星号前面加上tab
  • 有序列表1.加tab 并且后面的数字也都是1. Rmarkdown会自动修正
  • 新建代码chunk可以用insert和cmd+alt+I. chunk的名字在r加一个空格之后输入。如果一个chunk起名叫setup,那么不管运行哪一个chunk,这个chunk都会被先运行一遍
  • options们:eval = FALSE:这框框的代码不会被计算(evaluate)但是会显示。include = FALSE:跑代码但是不显示代码或者结果。echo = FALSE:跑代码,不显示代码,显示结果。message = FALSE/warning = FALSE:让最后的结果不显示message和warning。results = ‘hide’:隐藏printed output。fig.show = ‘hide’:隐藏plot。error = TRUE:如果这个chunk坏了那么还会继续运行其他chunk的内容。
  • knitr::kable(): 使得表格打印效果更好,同类函数包还有xtable, stargazer, pander, tables, ascii
  • 如果某个工程运行一次耗时很大,可以加上cached=TRUE来让运行的结果存起来,只要代码没变,之后运行的时候就不会重复计算。但有时这个chunk要接受其他chunk的结果,其他chunk如果变了的话是发现不了的,所以可以加上 dependson =‘chunk name’ 另外如果有读文件的操作的话,文件的修改也是不能被发现的,可以加上cache.extra=file.info(). 最后记得清理:knitr::clean_cache()
  • 可以通过knitr::opts_chunk$set()来修改默认的option
  • 在R-markdown中添加数字可以用format(x, digits=2, big.mark=’,’)等来规范格式
  • 如果我们在文字中想添加一些简短的数据信息(比如一个dataframe的行数),这时候重开一个chunk显然不是最好的做法,可以用r+空格+语句并用斜点来包围
  • 要注意有时候markdown的working directory和主环境的wd不是一个,可能会导致一些错误
  • 可以设置全局参数,在三个断线分隔的开头,加上 params: my_class:“suv” 这主要是想批量产生一些markdown文件,具体详见P437.书上的后一页有一些关于在markdown结尾加上注释和参考文献等信息,暂时也用不到
  • 图像的大小参数:老哥推荐的default: fig.width=6 fig.asp=0.618 out.width = “70%” fig.align = “center”。如果是多个图的话out.width = “50%”/“33%”/“25%” + fig.align = “default”
  • fig.show = “hold” 可以将图片强制放在代码的最后,而不是插在中间
  • fig.cap 可以添加caption
  • dev = “png” 损失了一点图片质量,但是可以换来效率。否则图片是pdf格式
  • 不同格式的帮助文件 ?rmarkdown::html_document()
  • 对于html文件,可以隐藏代码并且可以通过点击来打开:output:+回车+html_document: +回车+ code_folding:hide
  • {r include=FALSE, cache=FALSE} 不显示任何输出:# 可用来载入library
  • 用$和$$包围Latex可以得到行间或者单独的公式。后面那个$符号前面不能带空格
  • 换行用大于等于两个空格+回车或者两个回车
```{r, out.width = "400px"}
knitr::include_graphics("path/to/image.png") #调整插入本地图片大小
```

打印出来不同主题

表格的title

Shiny

杂七杂八的问题

  • 当错误信息是中文的时候:

    Sys.setenv(LANGUAGE = ‘en’) 再跑一遍程序,然后谷歌

  • 手动更新某个包:tidyverse_update()

  • ?也可以应用在内置数据集上,帮助文档会显示出每列的含义

  • Over-plotting: 很多函数在画图的时候用了取整,导致很多数据点重叠。

  • NA stands for ‘Not Available’

  • seriation包对两个因子变量同时排序,d3heatmap和heatmaply也是关于探求双因子变量关系的包

  • 一般来说,注释#是用来解释why而不是what和how。

  • 想看if的帮助文件需要加上``

  • 对于R里面的函数如果没有调用的话,它甚至都不会生成(lazy evaluation)。

  • 好像对于函数可以用testthat包来进行模拟测试,不太会用以后可以看看

  • traceback(): prints the functions called that generate the error.

  • 经常在自己的函数里面加一个check输入格式的部分,使之变得robust

  • options(warn=-1/0) 可以将warning藏起来/显示

assign(paste('X', i, sep=''), NULL) #这段代码可以配合for循环快速产生变量Xi

加载包的时候有时候会显示: Reason: image not found

Error in plot.new() : figure margins too large

lapply(paste('package:',names(sessionInfo()$otherPkgs),sep=""),detach,character.only=TRUE,unload=TRUE) # detach_all_packages

我们对一个factor变量,即使把某一类全部删去了,当我们打印的时候,那个空白的level还在里面。这会让plsDA函数失效

rmarkdown: Unicode char \u8:骞?not set up for use with LaTeX.

logistic出现perfect separation

有的github包装不上,需要先加载remote包:https://stackoverflow.com/questions/25721884/how-should-i-deal-with-package-xxx-is-not-available-for-r-version-x-y-z-wa

library(installr) # 更新R,同时保持package的方法
updateR()

Advanced R

这个作者Hadley Wickham好强,我唯一看过的R书《R For Data Science》就是他写的。他写过很多著名的包,我用过的有:ggplot2, dplyr, stringr, lubridate, readr, haven, devtools, roxygen2, testthat… tidyverse像是一个他的工作合集。

https://i.imgur.com/mg2hgeP.png

第一章

  • 一些R的特性:

阅读源代码之所以重要是因为他可以帮助你写出更好的代码。开始培养这种技能的一种好方法就是查看你经常使用的函数和package的源代码

  • 推荐阅读:
    • 《计算机程序的构造和解释》(英語:Structure and Interpretation of Computer Programs,SICP)简明又深奥,理解R的对象系统
    • Concepts, Techniques, and Models of Computer Programming. 理解R相对于其他编程语言的优缺点
    • 程序员修炼之道: 从小工到专家 (The Pragmatic Programmer) 让你成为一个更好的程序员

本书的网站使用jekyll构建,使用bootstrap样式,并通过travis-ci自动推送的Amazon的S3

  • array可以用来存放n维的数组

    https://i.imgur.com/QS2mHvK.png

R没有0维数据(Really? What about numeric(0) 我的理解是这个东西是一个一维但长度为0的数据),也没有标量类型。单独的数字或字符串都是向量。可以使用代码 str 给出结构,比typeof复杂。

不要使用is.vector()来判断是否是向量,只有当x没有任何其他属性的时候才会返回True。要使用 is.atomic() 或者 is.list() 来判断。1维的数据 (vector),只要不是list就一定是atomic。List 也属于 vector。

第二章

Vector

  • Atomic的六种类型
    1. logical
      • NA 默认是逻辑向量,如果在c()中使用就会被转成正确的类型,也可以直接使用:NA_integer_ , NA_real_ , NA_character_ 。
        • c(FALSE, NA_character_) 的输出是 #[1] "FALSE" NA 。所以 NA 默认是逻辑向量,因为他的等级最低
    2. integer (x = 1L 而不是 x = 1 )
    3. double (numeric)
      • is.numeric() 也可以用来检查 integer
    4. character
    5. complex (略过)
    6. raw (略过)

Atomic总是被展开,即使用嵌套来创建。x = c(1,c(2)) 等同于 x = c(1,2)

使用c()来进行合并:Atomic类型的强制转换,服从顺序:logical → integer → double → character。不过有时也会反着来,比如使用逻辑运算符 &,| 等。当 list 和 atomic 结合在一起的时候,atomic 会被强制转换成 list 。将 list 转变成 atomic 需要用 unlist()

1 == c("1") 会返回 True

Attribute

基本操作:

  • attr(x, 'class') 可以访问某一个特定的属性,attributes(x) 可以一次获得全部的属性。

  • structure 可以创建数据并同时赋予属性

    可以创建数据并同时赋予属性

    • 难怪我会经常在 dput() 里面看到这个函数,比如:structure(c(1L, 2L), .Label = c("A", "B"), class = "factor")

默认情况下,当向量被修改 / 变换之后他的大多数属性都会丢失,但是三个最重要的属性不会:

  1. Name:给每个元素一个名字的字符向量,使用

    names(x)
    • unnames(x) 可以创建没有名字的新向量,或是使用 names = NULL 来去掉名字。
  2. Dimension:将向量转换为矩阵和数组,使用 dim(x)

  3. Class:用于实现S3对象系统, 使用 class(x)

factor 只能包含预先定义的值,虽然看上去很像character,但其实是integer

有时一列数值型变量会因为非标准编码NA而被读成factor,转换的办法:

  1. as.characteras.double .
  2. 在用 read.csv 读入的时候,使用参数 na.strings = 来提前做好预防。

不推荐修改全局选项, 比如 options(stringAssFactors = FALSE) 。因为与其他代码联合使用的时候会造成无法预知的后果,也使代码变得难以理解。

x = structure(1:5, name = 'my attribute') R对待comment属性很特殊,它不会被打印。

# 这段代码有点意思,展示了四种情况
f1 = factor(letters) # 数据是正序abcd level的order也是正序
levels(f1) = rev(levels(f1)) # 数据逆序,level逆序
f2 = rev(factor(letters)) # 数据逆序, level正序
f3 = factor(letters, levels = rev(letters)) # 数据正序,level逆序

对于data.frame来说,length()ncol() 的结果是一样的。

plyr::rbind.fill() 可以解决 rbind 找不到同样名字的列会报错的问题,默认填成 NA .

cbind() 默认变成矩阵,如果想变成 data.frame 可以直接用 data.frame() 。在使用 cbind() 的时候最好保证所有输入都是同一类型来避免错误。

data.frame(x = 1:3, y = I(list(1:2,1:3,1:4))) 函数 I() 可以修复这个本来报错的代码。

data.frame 虽然支持把列表 / 数组变成他的列,不过要注意,很多处理 data.frame 的函数都假设所有的列都是 atomic 的。

第三章 Subset

包包

  • mc2d::rtrunc: truncate distribution generator
  • if(!require(“astro”)) install.packages(“astro”) 来检测包

reshape里面辅助ggplot可以画出来相关系数热度图

cm = cor(dat1[,-1])
melted_cormat <- melt(cm)
ggplot(data = melted_cormat, aes(x=X1, y=X2, fill=value)) + 
  geom_tile()

DiagrammeR: 用来画各类流程图

R Package R包开发

基础部分

A package bundles together code, data, documentation, and tests, and is easy to share with others.

RStudio can initialize a Git repository, in any Project, even if it’s not an R package, as long you’ve set up RStudio + Git integration. Do Tools > Version Control > Project Setup. Then choose Version control system: Git and initialize a new git repository for this project.

A reasonable starting position is to make a new .R file for each function in your package and name the file after the function. As you add more functions, you’ll want to relax this and begin to group related functions together.

Packages and scripts use different mechanisms to declare their dependency on other packages and to store example or test code.

It’s considered a best practice to include a full license in your package’s source, such as on GitHub, but CRAN disallows the inclusion of this file in a package tarball.

create_package('path'): 创建一个新的package

use_git() :使用Git来进行version control

use_r():创建函数,会自动产生R文件

load_all():把R文件夹下的所有.R文件都运行,把函数都存进Rstudio,但是并不在Environment里面

  • exists("function_name", where = globalenv(), inherits = FALSE)

check():检查这个package是否存在问题,耗时不短,但是特别有用的一个函数。

use_mit_license("Author Name"):使用一个license

document():产生各种文件,比如NAMESPACE

install():将包安装进本地

use_testthat():准备使用testthat来做testing

use_test('function_name'):写一个test case,不过现在我还不知道该怎么写

test():开始测试那个testthat函数

use_package('package_name'):放在这里的目的是保证在安装包的时候,这些附加的包也存在在电脑里。相当于require()的感觉。

快捷键

  • ctl+alt+上:将光标变长,可以好几行一起编辑
  • 在console里面使用cmd+上:可以查看最近敲过的代码
  • 在出现备选函数名的时候,敲击回车或tab都可以选中。
  • cmd+shift+P: 重新发送刚刚的代码到console
  • cmd+shift+R: 添加代码之间分隔线

#xxx== 可以创建可折叠代码段


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!