R 语言实用语法和常用资源速查手册

持续更新:R 语言的实用语法和常用资源

Awesome Website

Useful Command

  • 搜索某个包下的指定函数:?proxy::dist
  • 查看包的帮助手册:browseVignettes(package = "dplyr")
  • 读取文件夹下的所有指定类型的文件:list.files("../data_survey/", pattern="*.xls")
  • 打开新窗口用于存储新图形:dev.new()
  • 查看变量类型:mode()
  • 查看变量的种类个数:table()
  • 变量 0-1 标准化:scale()
  • 删除所有包含 temp 的对象:rm(list=ls()[grepl('temp',ls())])
  • 查看和清空内存:gc(reset=TRUE)
  • 分类汇总,根据 position 对 a1\a2\a3 分别求和:aggregate(datos[,c("a1","a2","a3")], by=list(datos$Position), "sum")
  • 根据多列取不重复的子集:df[!duplicated(df[,1:2]),]

Array

  • 去除数组两端的 0 值:x[min(which(x!=0)) : max(which(x!=0))]
  • 计算一个向量的累积求和或累积求积
    • cumsum(c(1,2,3))1,3,6
    • cumprod(c(1,2,3))1,2,6
  • 比较两个向量是否完全相同:identical(vector1, vector2)
  • 自动产生向量的下标:seq_along()

List

  • 选择列表的多个元素:mylist[c(1,3,5)],而双中括号选择的是再下一层
  • R 中字典的概念
    • list(a = 1,b = "foo",c = 1:5)
    • list[['a']] 返回 1

Data Frame

  • 将 data.frame 的所有 NA 替换为 0:d[is.na(d)] <- 0
  • 更改数据框或矩阵的列名:colnames(dt)[1] <- "cn"
  • 去除包含 NA 的行 / 去除某些列包含 NA 的行 / 去除头尾包含 NA 的行
    1
    2
    3
    4
    5
    6
    7
    8
    dt[complete.cases(dt),]
    dt[complete.cases(dt[,5:6]),]
    # 如果一定要用 is.na()
    dt[rowSums(is.na(dt[,5:6]))==0,]
    # 去除头尾包含 NA 的行,中间行包含 NA 则不去除
    df[min(which(complete.cases(df)==1)):max(which(complete.cases(df)==1)) ,]

Factor

Statistics

  • set.seed():是用于产生随机数的,编号设定基本可以随意
  • 根据 t 值求 p 值:p.value = 2*pt(-abs(t.value), df=length(data)-1)
  • 从模型中抽取 Log-Liklihood 值:logLik(mylogit)
  • 抽取模型的拟合值:fitted()
  • 创建两个分类的 Dummy:as.numeric(gear_box=="手自一体")
  • 计算四分位数间距:IQR()
  • 计算百分位数:quantile(x, probs=c(0.25, 0.75))

Advanced Function

Reduce

  • Reduce takes a binary function and a list of data items and successively applies the function to the list elements in a recursive fashion. For example:
    1
    2
    Reduce(intersect,list(a,b,c))` is the same as `intersect((intersect(a,b),c)
    Reduce(function(x,y) merge(x,y,by="cust_no"), list(vege_loyal,fruit_loyal,meat_loyal))

Apply Family

  • datacamp_tutorial
  • apply(x, margin, fun):x is an array or matrix, margin = 1 for row / 2 for column, such as apply(matrix, 2, sum)
  • lapply:和 apply 的不同是也可以应用于 dataframes, lists or vectors,并且 return list
    • lapply(MyList,"[", , 2):从列表的每一个矩阵中选取第二列元素,返回一个向量列表
    • The [ notation is the select operator
    • The [[ ]] notation expresses the fact that the we are dealing with lists
  • sapply:和 lapply 类似,但不同是 sapply 返回最基础的数据结构,而不是列表
    • sapply(MyList,"[", 2, 1 ):选取列表每一个矩阵中的第二行第一列的元素,返回一个向量
    • unlist(lapply(MyList,"[", 2, 1 )):lapply 的结果 unlist 之后才返回向量
  • rep(): sapply 返回结果配合 rep 函数使用,比如 rep(c(1,4,8),c(3,1,2)) 返回 c(1,1,1,4,4,8)
  • mapply: applies a Function to Multiple List or multiple Vector Arguments, such as mapply(rep,1:4,4),相当于 rep(c(1,2,3,4),c(4,4,4,4)) 或者 c(rep(1, 4), rep(2, 4), rep(3, 4), rep(4, 4))
  • sweep:比如矩阵每一列减去各列均值data <- sweep(data, 2, data_means,"-"),均值可以先通过 apply 求出

Eval & Assign

  • Eval() 函数可以将字符串转变为变量名
    • 如果用字符串表示的变量无需被赋值,只是表示变量,则用 eval 函数转换:var <- eval ( parse ( text = "string" ) )
  • Assign() 函数可以为以字符串命名的变量赋值
    • 如果用字符串表示的变量是被赋值对象,则使用 assign 函数 assign(paste(str1,str2,sep=""), value)

DateTime Transfermation

  • 将字符串转换为 Date 类型
    • as.Date('20140325',"%Y%m%d")
    • strptime('2012-09-16 19:35:58',"%Y-%m-%d %H:%M:%S")
  • lubridate
    • 获取年份:year(as.Date('20130204',"%Y%m%d"))
    • 获取月份:month(as.Date('20130204',"%Y%m%d"))
    • 获取周数
      • 从1月1日开始计算: week(as.Date('20130204',"%Y%m%d"))
      • 从星期一开始计算:isoweek()
    • 获取该月第几天:mday(as.Date('20130204',"%Y%m%d"))
    • 获取该年第几天:yday(as.Date('20130204',"%Y%m%d"))
  • 将 Excel 中的数字型日期时间转换为日期
    • as.Date(41310.11, origin = "1899-12-30") 41310 的单位是天
    • as.POSIXct(41310*24*3600, origin = "1899-12-30") POSIXct 函数的单位是秒
  • 求两个日期之间的差
    1
    2
    difftime(as.Date(as.integer(41310.12), origin = "1899-12-30"), as.Date('20130204',"%Y%m%d"), units='days')
    as.integer(difftime(max(t1,t2,t3,t4), min(t1,t2,t3,t4), units="mins"))

Time Series

  • 获取时间序列的日期:as.Date(time(ts))
  • 获取时间序列的起止时间:start(ts) end(ts),返回的都是 numeric 数组,通过下标获取年月
  • 根据起始时间产生连续的时间seq.Date,然后创建 zoo 对象
1
2
3
4
5
6
from <- as.Date("1974-01-01")
to <- as.Date("1989-12-31")
months <- seq.Date(from=from,to=to,by="month")
values <- rep.int(0,length(months))
Zooserie <- zoo(values, months)

String Processing

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 分割字符串
strsplit('abc-ds','-')[[1]][2]
# 判断一个字符串是否包含在另一个字符串中
grepl('-','dadas-')
# 统计长度
length() # 对象 object 的长度
nchar() # 字符串的长度
# 获取一个字符串的子串
substr(string, start_index, end_index)
# 替换字符串中的字符
gsub('e', '', 'e123') # 返回 123
# 判断一个字符串的开头结尾是否为特定字符
startsWith("2013-01", "2013-")
endsWith("2013-11", "11")

Set Operation

  • a <- c("b", "c", "d", "e") b <- c("d", "e", "f", "g")
    • 交集:intersect(a,b) = d,e
    • 并集:union(a,b) = b,c,d,e,f,g
    • 差集:setdiff(a,b) = b,c / setdiff(b,a) = f,g

R Packages

  • require()library() 最大的不同是前者返回一个 Logical Value,如果包不存在则继续运行
    1
    2
    3
    4
    if (!require("abc", character.only=T, quietly=T)) {
    install.packages("abc")
    library("abc, character.only=T)
    }

Data Manipulation & Input & Output

  • Excel File
    • openxlsx: data <- read.xlsx("abc.xlsx", sheet = 1, startRow = 2, colNames = TRUE) 只能读取 .xlsx
    • XLConnect:wb = loadWorkbook("../data_survey/A1.xls") df = readWorksheet(wb, sheet = "Sheet1", startRow = 2, header = FALSE)
  • tidyr
    • gather():将除了 iteration 的所有列转变为 key-value 的形式:recall <- gather(recall_i, key='keyname', value='valuename', -iteration)
    • spread():将 key:value 的形式重新转变为 column 的形式 spread(recall,key,value)
    • seperate():将一列通过分隔符分拆为多列
    • unite():多列合并为一列
  • dplyr
    • window():比如截取时间序列 window(ts, start=c(1949, 1), end=c(1959,12))
    • Ranking functions:min_rank() percent_rank() dense_rank()
    • lead() & lag():不同包的 lag 函数用法不同,必须指定 dplyr::lag(ts,1)
  • sqldf: df <- sqldf('select * from dataframe')
  • texregConversion of R Regression Output to LaTeX or HTML Tables
  • stargazerWell-Formatted Regression and Summary Statistics Tables
  • formatR: Format R Code AutomaticallyIntroduction
  • gridExtragrid.table() 将表格输出为图片

Big Data & Optimization

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# 计算指定行的变量均值:
test[GROUP_ID==1 & CLASS_ID==100, .(m_qty=mean(QTY))]
# 统计各个分组满足条件的行数, .N 是一个内建的变量,它表示当前的分组中对象的数目
test[GROUP_ID==1, .N, by=group_id]
# 按照分组变量排序并计算平均值
flights[carrier == "AA", .(mean(arr_delay), mean(dep_delay)), keyby=.(origin, dest, month)]
# keyby 默认按升序排序,如果想改变排序
flights[carrier == "AA", .N, by=.(origin, dest)][order(origin, -dest)]
# by 也可以指定表达式,比如计算起飞延误和到达延误的航班各有多少(生成4行)
flights[, .N, .(dep_delay>0, arr_delay>0)]
# 同时对多列进行计算,.SD 包含了除分组变量之外的所有列
DT[, lapply(.SD, mean), by=ID]
# 返回每个分组的前两行
ans <- flights[, head(.SD, 2), by=month]
# 根据 ID 连接某个变量的所有字符串
dt[, lapply(.SD, paste0, collapse=" "), by = ID]
# .SDcols 可以指定 .SD 中包含哪些列,而不是除分组变量之外的所有列
flights[carrier == "AA", lapply(.SD, mean), by=.(origin, dest, month), .SDcols=c("arr_delay", "dep_delay")]
# 快速读取大文件
fread('example.csv', sep=',', header=TRUE, integer64="character", encoding='UTF-8')
# 数据选取:选取行
flight[1:10]
# 数据选取:选取列(返回 vector)
flight[, arr_delay]
# 数据选取:选取列(返回 data.table),对 data.table 赋值时使用!
flight[, list(arr_delay)]
flights[, .(arr_delay, dep_delay)]
flight[, "arr_delay"]
# with=FALSE,myvector 才会被看做列名,并返回 data.table,否则返回向量
mtcarsDT[, myVector, with=FALSE]
# := operator 添加新列/移除一列/更改指定行某一列的值
DT[,new_colname:=42]
DT[,extant_colname:=NULL]
trade[date=="2013-12-31", year_week := "2014-01"]
# := operator 性能对比
system.time(for (i in 1:1000) DF[i,1] <- i) # Elapsed 591
system.time(for (i in 1:1000) DT[i,V1:=i]) # Elapsed 1.158 (511 times faster)

Time Series

  • kernlab:Gaussian Process Regression
  • bsts: Baayesian Structural Time Series
  • tseries: Time Series Analysis and Computational Finance
  • fUnitRoots: Trends and Unit Roots
  • urca: Unit root and cointegration tests for time series data
  • forecast: Forecasting Functions for Time Series and Linear Models
1
2
3
4
checkresiduals(model) # 模型残差正态性和纯随机性检验图
gghistogram(ts) # 时间序列取值柱状图
ggseasonplot(ts, polar=TRUE) # 时间序列季节性雷达图
autoplot(temp_ts, series="Data") + autolayer(forecast, series="Forecast") + autolayer(fitted(model), series="Fitted") # 真实值+拟合值+预测值 (当然也可以通过数据框存储数据然后自己作图)
  • WaveletComp:小波分析和时间序列重构,Wavelet analysis and reconstruction of time series, cross-wavelets and phase-difference (with filtering options), significance with simulation algorithms.

Algorithm & Modeling


RStudio

Shortcut Key in RStudio

  • Clear console: Ctrl + L
  • Insert a chunk in Rmd: Ctrl + Alt + I
  • Add comment: Ctrl + Shift + C

R markdown

1
2
3
4
5
6
7
8
9
10
11
12
output:
html_document:
toc: true
toc_depth: 6
number_sections: false
toc_float:
collapsed: false
smooth_scroll: false
theme: readable
highlight: tango
code_folding: show
df_print: paged
  • Cheet Sheet
  • 生成 HTML 时,如果找不到对象,先 load(file=".RData")
  • 屏蔽代码提示和警告信息:{r message=FALSE, warning=FALSE}

Others

Run R in CentOS

  • 在 Centos 中安装 R

    1
    2
    3
    sudo yum install -y epel-release
    sudo yum update -y
    sudo yum install -y R
  • 运行 R 脚本并输出信息到终端: Rscript a.R

  • 运行 R 脚本并输出到文件(默认 a.Rout): R CMD BATCH a.R

    1
    2
    3
    R CMD BATCH a.R
    # Check the output
    cat a.Rout
  • 断开终端后离线运行 R 脚本

    • 安装 screen:yum install screen
    • 新建一个会话:screen -S lnmp (lnmp为会话名,可自己定义)
    • 离开会话并让程序继续运行:ctrl a d (按住ctrl不放,分别按 a 和 d)
    • 恢复后台运行的会话:screen -r lnmp(lnmp为自己定义的会话名)
    • 显示所有screen创建的会话:screen -ls
    • 在会话里执行 exit 命令会话是结束运行并退到 shell 中
  • 也可以使用 nohup 命令:nohup R CMD BATCH wenjian.R wenjian.out

Project Management

  • Get data out of R: 1 2
  • 从另一个 R Project 中读取对象的方法
    • 先保存一个项目中的对象:saveRDS(df, file="mytweets.rds")
    • 再到另一个项目中读取:df2 <- readRDS("mytweets.rds")
  • getwd(): 查看当前工作目录
  • ls(): 列出所有对象的名字
  • ls.str(): 列出所有对象的详细信息
  • save.image(): 保存工程!

Update R

  • 所有包均安装在 R 安装路径的 Library 目录中,直接拷贝转移即可!
  • 当然,也可以通过下列命令恢复已安装的包
  • 启动当前版本,输入以下命令
    • oldip <- installed.packages()[,1]
    • save(oldip, file=”installedPackages.Rdata”)
  • 卸载旧版本
  • 下载安装新版本,启动新版本输入以下命令
    • load(“installedPackages.Rdata”)
    • newip <- installed.packages()[,1]
    • for(i in setdiff(oldip, newip)) install.packages(i)