R语言基础(1)——使用技巧&包
advancer
北京大学金融学+心理学学生一枚~
关注她
1. 使用介绍和技巧
1.1 R的获取和安装:
Comprehensive R Archive Network CRAN
http://cran.r-project.org
•Linux 、 Mac OS X 和 Windows 都有相应编译好的二进制版本。
•安装包( package )作为可选模块同样可从 CRAN 下载,来增强 R 的功能。
•Windows 操作系统个人电脑上安装 R 的运行平台:R gui & R studio
如果选择Windows 系统,需要再安装 Rtools:
•Rtools is a toolchain bundle used for building R packages from source (those that need compilation of C/C++ or Fortran code) and for build R itself.
RTools: Toolchains for building R and R packages from source on Windows
https://cran.r-project.org/bin/windows/Rtools/rtools43/files/rtools43-5493-5475.exe
1.2 使用技巧
r studio里可以用R Markdown写,生成rmd文件,可用于报告
键入要运行的命令的前几个字母,如book,按“Ctrl+向上光标键”,就可以显示历史命令中以book开头的所有命令,单击哪一个,哪一个就自动复制到命令行
Rmd 文件中用```{r} 开头,用```结尾的段落是 R程序段,
在显示的程序段的右侧有一个向右箭头形状的小图标
(类似于媒体播放图标),点击该图标就可以运行该程序段。
2. 包(package)
2.1 概念
•包是 R 函数、数据、预编译代码以一种定义完善的格式组成的集合。计算机上存储包的目录称为库(library)
•函数 libPaths() 能够显示库所在的位置;
•函数 library() 则可以显示库中安装有哪些包。
•R 自带了一系列默认包(包括 base 、 datasets 、 utils 、 grDevices 、graphics 、 stats 以及 methods )它们提供了种类繁多的默认函数和数据集。
命令 search() 可以告诉你哪些包已加载并可使用。
R studio右下角可以查找、载入包
2.2 安装
install.packages(" ")
如果不成功,从CRAN镜像下载:
install.packages ("gclus", repos = "https://mirrors.tuna.tsinghua.edu.cn/CRAN/")
2.3 更新:update.packages(" ")
2.4 查看已经安装的包:installed.packages()
2.5 载入:library( )
library 和 require 都可以 载入包 ,但二者存在区别。
如果一个包不存在,执行到library 将会停止执行, require 则会继续执行,返回False
2.6 查看:
命令 help ( package = "package_name") 可以输出某个包的简短描述以及包中的函数名称和数据集名称的列表
2.7 卸载和卸除
卸载:detach,还会使用
卸除:remove,不再使用
R语言基础(2)——基本命令
advancer
北京大学金融学+心理学学生一枚~
关注她
2 人赞同了该文章
1. 赋值
x <- ……
如age <- c(20,21,30,50)
2. 帮助
3. 设置工作目录
setwd ("C:/myprojects/…") 或者用 \\ (\是一个转义符)
显示当前工作目录位置:getwd()
4. 保存历史记录/管理工作空间
savehistory() ——命令的历史记录保存到文件 Rhistory 中;
save.image() ——工作空间(包含向量 x )保存到文件 RData 中。
如 options(digits=3):数字被格式化为小数点后3位有效数字的格式
如果使用RStudio 软件,也需要把不同项目放在不同文件夹,并且每个项目在RStudio 中单独建立一个“项目”(project)。要分析哪个项目的数据,就打开哪个项目。不同项目使用不同的工作空间。
5. 输入输出
1. 执行外部脚本
source ("myscript.R")
将执行包含在文件 myscript.R 中的 R 语句集合。依照惯例,脚本文件以 .R 作为扩展名
编码问题:
在 MS Windows 操作系统中,默认的中文编码是 GB18030 编码。R 源程序文件的中文编码可能是 GB18030也可能是 UTF-8。UTF-8 是在世界范围更通用的编码。
如果发现用上述命令运行时出现中文乱码,可能是因为源程序用了 UTF-8 编码,
这时 source() 命令要加上编码选项如下:
source("myprog.R", encoding="UTF-8")
File – Save/Reopen with Encoding
2. 输出文本结果到指定文件中,可覆盖/追加
sink(" filename")
文件已经存在,则它的内容将被覆盖。
使用参数 append=TRUE 可以将文本追加到文件后,而不是覆盖它;
参数 split=TRUE 可将输出同时发送到屏幕和输出文件中。
sink():仅屏幕显示输出结果/关闭文件不再记录
用 cat() 函数显示多项内容,包括数值和文本,文本包在两个单撇号或两个双撇号中,如:
cat("sin(pi/2)=", sin(pi/2), "\n")
## sin(pi/2)= 1
cat() 函数最后一项一般是"\n", 表示换行。忽略此项将不换行。
3. 输出图形结果到指定文件中
dev.off():输出到终端
以下函数:拓展名("文件名")
R语言基础(3)——数据与输入
advancer
北京大学金融学+心理学学生一枚~
关注她
1. 数据类型和结构
1. 数据类型
数值型(numeric)
字符型(character)也就是string
日期型(date)
c<-as.Date ("2021 03 08")
class(c)
d<-as.POSIXct ("2021 03 08 13:00") 含日期和时间
class(d)
4. 逻辑型logical)
e<- TRUE; f<- FALSE
(可以用class()查看变量中的数据类型)
2. 数据结构
向量 vector (最小单位)
存储 数值型 、字符型 或逻辑型 的一维数组。
创建示例:
a <- c(1, 2, 5, 3, 6, -2, 4)
x < - 1:10
矩阵matrix:二维数组
用函数matrix创建
y <- matrix (vector, nrow=…, ncol=…, byrow = TRUE)
数组array:可以多维
数据框dataframe:不同列数据类型可以不同
用函数data.frame()创建
访问变量(LEC. 1 P59)
绑定数据框
因子factor:名义型变量(categorial)
status <-c("Poor", "Improved", "Excellent", "Poor")
status <-factor(status, ordered=TRUE )
(ordered=TRUE 选项将factor普通因子变成 有序变量)
将向量编码为(3, 2, 1, 3),并在内部将这些值关联为 1=Excellent 、 2=Improved 以及 3=Poor 。
针对此向量进行的任何分析都会将其作为有序型变量对待,并自动选择合适的统计方法。可以通过指定 levels 选项来覆盖默认排序
status <- factor (status, order=TRUE , levels=c("Poor", "Improved", "Excellent"))
将指定1=Poor 、 2=Improved 、 3=Excellent
列表list:可以是多种数据类型的组合
2. 数据输入——读入文件
1. 读取文件
data<- read.table (file, header=TRUE, sep= "delimiter", row.names="namelist")
data <- read.csv ("xxx.csv", header=TURE, as.is = "TRUE")
还可以用read_csv()
print(head(tax.tab))
file 是一个带分隔符的 ASCII 文本文件,
header 是一个表明首行是否包含了变量名的逻辑值( TRUE 或 FALSE)
as.is=TRUE 说明字符型列要原样读入而不是转换为因子(factor)
sep 用来指定分隔数据的分隔符,
row.names 是一个可选参数,用以指定一个或多个表示行标识符的变量。
head() 函数返回数据框或向量的前几项
2. 数据框X写入文件
write.table (x, file = "", append = FALSE, quote = TRUE, sep = "", eol = "\n", na = "NA", dec = ".", row.names = TRUE, col.names = TRUE, qmethod = c("escape", "double"), fileEncoding = "")
3. web地址的文件数据输入
• file <- http://162.105.145.16/rs/R_data_samples/export2020.csv
• pop<-read.csv(file, header=TRUE, sep = ",", stringsAsFactors = F)
• file <- http://162.105.145.16/rs/R_data_samples/export2020-1.csv
• pop<-read.csv(file, header=TRUE, sep = ",", stringsAsFactors = F) #出错
• pop<-read.csv(file, header=TRUE, sep = ",", stringsAsFactors = F, fileEncoding
= "UTF-8") #加编码格式
4. 其他导入方式
• Excel表导入
• 导入XML
• 从网页抓取数据
• 导入SPSS
• 导入SAS
• 导入Stata
• 导入NetCDF
• 导入HDF5
R语言基础(4)——数值型向量运算函数
advancer
北京大学金融学+心理学学生一枚~
关注她
1. 四则
两个不等长向量的四则运算,
1. 如果其长度为倍数关系,规则是每次从头重复利用短的一个。
不仅是四则运算,R 中有两个或多个向量按照元素一一对应参与某种运算或函数调用时,如果向量长度不同,一般都采用这样的规则。
2. 如果两个向量的长度不是倍数关系,会给出警告信息。
2. 数学函数
为了查看这些基础的数学函数的列表,运行命令help.start(),点击链接“Search Engine and Keywords”,找到“Mathematics” 栏目,浏览其中的“arith” 和“math” 链接中的说明。
• 舍入:ceiling, floor, round, signif, trunc, zapsmall
• 符号函数 sign
• 绝对值 abs
• 平方根 sqrt
• 对数与指数函数 log, exp, log10, log2
• 三角函数 sin, cos, tan
• 反三角函数 asin, acos, atan, atan2
• 双曲函数 sinh, cosh, tanh
• 反双曲函数 asinh, acosh, atanh
• 贝塔函数 beta, lbeta
• 伽玛函数 gamma, lgamma, digamma, trigamma, tetragamma, pentagamma
• 组合数 choose, lchoose
• 富利叶变换和卷积 fft, mvfft, convolve
• 正交多项式 poly
• 求根 polyroot, uniroot
• 最优化 optimize, optim
• Bessel 函数 besselI, besselK, besselJ, besselY
• 样条插值 spline, splinefun
• 简单的微分 deriv
3. 排序函数
sort(x) 返回按顺序排序后的结果
rev(x) 返回把各元素排列次序 反转后的结果
order(x) 返回排序用的下标(显示从小到大排序后该元素原本所在位置的序号)
4. 生成序列
seq 函数是冒号运算符的推广。
比如:
seq(5) 等同于1:5。
seq(2,5) 等同于2:5。
seq(11, 15, by=2) 产生11,13,15
seq(0, 2*pi, length.out=100) 产生从0 到2 的等间隔序列,序列长度指定为100
比如seq(to=5, from=2)} 等同于2:5
rep() 函数用来产生重复数值。
为了产生一个初值为零的长度为n 的向量,用 x <- rep(0, n)。
rep(c(1,3),2) 把第一个自变量重复两次,结果相当于c(1,3,1,3)。
rep(c(1,3), c(2,4)) 则需要利用R 的一般向量化规则,把第一自变量的第一个元素1 按照第二自变量中第一个元素2 的次数重复,把第一自变量中第二个元素3 按照第二自变量中第二个元素4 的次数重复,结果相当于c(1,1,3,3,3,3)。
如果希望重复完一个元素后再重复另一元素,用each= 选项,
比如rep(c(1,3), each=2) 结果相当于c(1,1,3,3)。
有一点技术性的小问题:1:5 和seq(5) 的结果是整型(integer)的,c(1,3,5) 和seq(1, 5, by=2) 的结果是浮点型(double)的。
5. 统计函数(见“描述统计”)
summary(tax.tab[[" 营业额"]])
可以给出最小值、最大值、中位数、四分之一分位数、四分之三分位数和平均值
mean()
sd()
sum(求和)
var(求样本方差)
min(求最小值)
max(求最大值)
range(求最小值和最大值)
prod 求所有元素的乘积
cumsum 和cumprod 计算累加和累乘积
pmax, pmin, cummax, cummin
加入na.rm=TRUE 选项:如果数据中有缺失值,可以删去缺失值后计算统计量
6. 复数向量
指定实部虚部:complex (real = c(1,0,-1,0), imaginary = c(0,1,0,-1))
指定模和辐角:complex (mod=1, arg=(0:3)/2*pi)
生成结果:c(1+0i, 1i, -1+0i, -1i)
用Re(z) 求z 的实部,用Im(z) 求z 的虚部,
用Mod(z) 或abs(z) 求z 的模,用Arg(z) 求z 的辐角,
用Conj(z) 求z 的共轭。
R语言基础(5)——逻辑型&字符型向量&集合运算函数
advancer
北京大学金融学+心理学学生一枚~
关注她
1. 逻辑型运算
(一般是自比较)
与NA比较会产生NA
为了判断向量每个元素是否NA,用is.na() 函数
< <= > >= == != %in%
分别表示小于、小于等于、大于、大于等于、等于、不等于、属于。要注意等于比较用了两个等号。
%in% 是比较特殊的比较,x %in% y 的运算把向量 y 看成集合,运算结果是一个逻辑型向量:x的第i个元素是否属于y的逻辑型值(输出的逻辑值数量=x包含的元素数量)
&, | 和 ! , 分别表示“同时成立”、“两者至少其一成立”、“条件的反面”
xor(x, y) 表示x 与y 的异或运算,即值不相等时为真值,相等时为假值,有缺失值参加运算时为缺失值。
用all() 测试所有元素为真;用any() 测试至少一个元素为真。允许有缺失值,结果可能为缺失值
函数which() 返回真值对应的所有下标
函数identical(x,y) 比较两个R 对象x 与y 的内容是否完全相同,结果只会取标量TRUE 与FALSE 两种。
函数all.equal() 与identical() 类似,但是在比较数值型时不区分整数型与实数型,而且相同时返回标量TRUE,但是不同时会返回一个说明有何不同的字符串。
函数duplicated() 返回每个元素是否为重复值的结果
用函数unique() 可以返回去掉重复值的结果。
2. 字符型运算
注意空字符串并不能自动认为是缺失值,字符型的缺失值仍用NA 表示。
paste():一对一依次连接两个字符型向量
(默认用空格连接,可以设定sep="")
collapse="" 参数可以把一个字符型向量的内部的各个元素连接成一个单一的字符串
toupper() 函数把字符型向量内容转为大写,tolower() 函数转为小写
用nchar(x, type='bytes') 计算字符型向量x 中每个字符串的以字节为单位的长度,
这一点对中英文是有差别的,中文通常一个汉字占两个字节,英文字母、数字、标点占一个字节。
substr(x, start, stop) 从字符串x 中取出从第start 个到第stop 个的子串
substr(x, start,stop) 对字符型向量x的每个元素取从第start 个到第stop 个的子串
substring(x, start) 可以从字符串x 中取出从第start 个到末尾的子串。
as.numeric() 把内容是数字的字符型值转换为数值
as.character() 函数把数值型转换为字符型
用指定的格式数值型转换成字符型,可以使用sprintf() 函数
用gsub() 可以替换字符串中的子串,这样的功能经常用在数据清理中。
比如,把数据中的中文标点改为英文标点,去掉空格,等等。
x <- '1, 3; 5'
gsub(';', ',', x, fixed=TRUE)
## [1] "1, 3, 5"
字符串x 中分隔符既有逗号又有分号,上面的程序用gsub() 把分号都换成逗号。
正则表达式
R 中支持perl 语言格式的正则表达式,grep() 和grepl() 函数从字符串中查询某个模式,sub() 和gsub() 替换某模式。
集合运算
unique(x) 可以获得x 的所有不同值
a %in% x 判断a 的每个元素是否属于向量x
match(x, table) 对向量x 的每个元素,从向量table 中查找其首次出现位置并返回这些位置。没有匹配到的元素位置返回NA
intersect(x,y) 求交集,结果中不含重复元素
union(x,y) 求并集,结果中不含重复元素
setdiff(x,y) 求差集,即x 的元素中不属于y 的元素组成的集合,结果中不含重复元素
setequal(x,y) 判断两个集合是否相等,不受次序与重复元素的影响
R语言基础(6)——因子(factor)
advancer
北京大学金融学+心理学学生一枚~
关注她
因子(factor)
R中的数据结构之一。R 中用因子代表数据中分类变量, 如性别、省份、职业。有序因子代表有序量度,如打分结果,疾病严重程度等。
1. 常见函数
1. factor() 函数把字符型向量转换成因子
factor (x, levels = sort(unique(x), na.last = TRUE),
labels, exclude = NA, ordered = FALSE)
(可以用选项levels 自行指定各水平值, 不指定时由x 的不同值来求得。
可以用选项labels 指定各水平的标签, 不指定时用各水平值的对应字符串。
可以用exclude 选项指定要转换为缺失值(NA) 的元素值集合。如果指定了 levels, 则当自变量x 的某个元素等于第 个水平值时输出的因子对应元素值取整数 , 如果该元素值没有出现在levels 中则输出的因子对应元素值取NA。
ordered 取真值时表示因子水平是有次序的(按编码次序)。
在使用factor() 函数定义因子时,如果知道自变量元素的所有可能取值,应尽可能使用levels= 参数指定这些不同可能取值,这样,即使某个取值没有出现,此变量代表的含义和频数信息也是完整的。自己指定levels= 的另一好处是可以按正确的次序显示因子的分类统计值。因为一个因子的levels 属性是该因子独有的,所以用c() 或者rbind() 合并两个因子有可能造成错误,保险的做法是在定义两个因子时用levels 参数指定相同的水平值集合。较新版本的R 软件已经解决了这个问题。)
2. levels() 函数访问levels属性
levels(sex)
## [1] " 男" " 女"
因子的levels 属性可以看成是一个映射,把整数值1,2,… 映射成这些水平值,因子在保存时会保存成整数值1,2,…等与水平值对应的编号。
1) as.numeric() 可以把因子转换为纯粹的整数值
as.numeric(sex)
## [1] 1 2 1 1 2
2) as.character() 可以把因子转换成原来的字符型
3. cut()函数
连续取值的变量,可以用cut() 函数将其分段,转换成因子。使用breaks() 参数指定分点,最小分点要小于数据的最小值,最大分点要大于等于数据的最大值,默认使用左开右闭区间分组
为了实现各组个数比较平均的分组,quantile() 函数计算分位数作为分组
table():统计因子各水平的出现次数(称为频数或频率)。也可以对一般的向量统计每个不同元素的出现次数
tapply() 函数:
可以按照因子分组然后每组计算另一变量的概括统计
(两个变量,按照一个分组,算另一个的统计量)
h <- c(165, 170, 168, 172, 159)
tapply(h, sex, mean)
## 男女
## 168.3333 164.5000
2. forcats 包
fct_reorder() 可以根据不同因子水平分成的组中另一数值型变量的统计量值排序
fct_reorder() 函数:按照统计量次序对因子排序
fct_relevel()函数:在因子水平数较多时仅想将特定的一个或几个水平次序放到因子水平最前面
fct_reorder2(f, x, y) 也调整因子f 的水平的次序,但是根据与每组中最大的x 值相对应的y 值大小调整次序,这样在作多个因子水平对应的曲线图时可以比较容易地区分多条曲线。
fct_recode() 可以修改每个水平的名称
如果合并很多,可以用fct_collapse() 函数
如果某个因子频数少的水平很多,在统计时有过多水平不易展示主要的类别,可以用fct_lump(f) 合并,缺省地从最少的类合并一直到“其它” 类超过其它最小的类之前,可以用n= 参数指定要保留多少个类。
R语言基础(7)——列表(list)
advancer
北京大学金融学+心理学学生一枚~
关注她
1 人赞同了该文章
列表可以有多个元素,但是与向量不同的是,列表的不同元素的类型可以不同
1. 定义/生成
list()
rec <- list(name=" 李明", age=30, scores=c(85, 76, 90))
2. 访问元素
单个列表元素必须用 [[两重方括号]] 格式访问
rec[[3]]
## [1] 85 76 90
rec[[3]][2]
## [1] 76
rec[["age"]]
## [1] 30
列表的单个元素也可以用$ 格式访问,如
rec$age
## [1] 30
如果使用单重方括号对列表取子集,结果还是列表而不是列表元素
rec[3]
## $scores
## [1] 85 76 90
列表一般都应该有元素名,元素名可以看成是变量名,列表中的每个元素看成一个变量。用names() 函数查看和修改元素名
3. 修改/添加/删除元素
rec[[" 三科分数"]][2] <- 0
## $ 三科分数
## [1] 85 0 90
把某个列表元素赋值为NULL 就删掉这个元素。如
rec[["age"]] <- NULL
在list() 函数中允许定义元素为NULL,这样的元素是存在的
4. 列表类型转换
用as.list() 把一个其它类型的对象转换成列表;
用unlist() 函数把列表转换成基本向量。
5. 拆分
strsplit() 输入一个字符型向量并指定一个分隔符,返回一个项数与字符型向量元素个数相同的列表,列表每项对应于字符型向量中一个元素的拆分结果
sapply() 函数:把拆分结果(包含几个列表的变量)进一步转换成一个数值型矩阵
R语言基础(8)——矩阵和数组(matrix&array)
矩阵和数组:
矩阵用matrix 函数定义,实际存储成一个向量,根据保存的行数和列数对应到矩阵的元素,存储次序为按列存储(从上到下;从左到右)。
1. 生成
A <- matrix(11:16, nrow=3, ncol=2)
matrix() 函数把矩阵元素以一个向量的形式输入
用nrow 和ncol 规定行数和列数,
向量元素填入矩阵的缺省次序是按列填入,
用byrow=TRUE 选项可以转换成按行填入。
函数t(A) 返回 A 的转置。
2. 属性
nrow() 和ncol() 函数可以访问矩阵的行数和列数
dim() :访问dim() 属性,内容是两个元素的向量,两个元素分别为矩阵的行数和列数。
3. 子集
注意在对矩阵取子集时,如果取出的子集仅有一行或仅有一列,结果就不再是矩阵而是变成了R 向量,R 向量既不是行向量也不是列向量。如果想避免这样的规则起作用,需要在方括号下标中加选项drop=FALSE
1. 用数值下标提取
用A[1,] 取出A 的第一行,变成一个普通向量。
用A[,1] 取出A 的第一列,变成一个普通向量。
用A[c(1,3),1:2] 取出指定行、列对应的子矩阵。
2. 用字符型名字下标提取
A[,'Y']
A['b',]
A[c('a', 'c'), 'Y']
colnames() 函数可以给矩阵每列命名,也可以访问矩阵列名,
rownames() 函数可以给矩阵每行命名,也可以访问矩阵行名
3. 用逻辑下标(判断条件)提取
A[A[,1]>=12,'Y']
4. 用一个包含正整数的向量提取
可以向对一个向量取子集那样,仅用一个正整数向量的矩阵取子集
A[c(1,3,5)] (按默认列的填入顺序)
5. 用一个两列的矩阵作为位置下标,一列表示行坐标一列表示列坐标 提取
ind <- matrix(c(1,1, 2,2, 3,2), ncol=2, byrow=TRUE)
A
## X Y
## a 11 14
## b 12 15
## c 13 16
ind
## [,1] [,2]
## [1,] 1 1
## [2,] 2 2
## [3,] 3 2
A[ind]
## [1] 11 15 16
6. 函数取矩阵向量
对矩阵A,diag(A) 访问A 的主对角线元素组成的向量;
若x 为正整数值标量,diag(x) 返回x阶单位阵;
若x 为长度大于1 的向量,diag(x) 返回以x 的元素为主对角线元素的对角矩阵。
4. 矩阵变换、合并
若x 是向量,cbind(x) 把x 变成列向量,即列数为1 的矩阵,rbind(x) 把x 变成行向量。
若x1, x2, x3 是等长的向量,cbind(x1, x2, x3) 把它们看成列向量并在一起组成一个矩阵。允许有标量,这时此标量被重复使用。rbind()类似
5. 运算
四则运算
矩阵可以与标量作四则运算,结果为每个元素进行相应运算
当运算为矩阵乘以一个标量时,就是线性代数中的矩阵的数乘运算。
两个同形状的矩阵进行加、减运算,即对应元素相加、相减
对两个同形状的矩阵,用* 表示两个矩阵对应元素相乘(注意这不是线性代数中的矩阵乘法)
2. 用/表示两个矩阵对应元素相除。
用%*% 表示矩阵乘法而不是用* 表示
内积:sum(x*y)
外积:x %o% y
逆矩阵:solve();solve(A,b) 求解线性方程组 = 中的
6. apply() 函数
apply(A, 2, FUN) 把矩阵A 的每一列分别输入到函数FUN 中,得到对应于每一列的结果;
apply(A, 1, FUN) 把矩阵A 的每一行分别输入到函数FUN 中,得到与每一行对应的结果。
如果函数FUN 返回多个结果,则结果均为矩阵
7. 多维数组
定义/生成:
数组名<- array(数组元素, dim=c(第一下标个数, 第二下标个数, ..., 第s下标个数))
ara <- array(1:24, dim=c(2,3,4))
4 个2 × 3 矩阵。取出其中一个如ara[ , , 2](取出第二个矩阵);ara[,2, 2:3]
R语言基础(9)——数据框(dataframe)
advancer
北京大学金融学+心理学学生一枚~
关注她
2 人赞同了该文章
数据框
数据库表或Excel 数据表的形式
函数data.frame() 可以生成数据框
as.data.frame(x) 可以把x(向量、列表、矩阵)转换成数据框。
1. 生成
d <- data.frame(
name=c(" 李明", " 张聪", " 王建"),
age=c(30, 35, 28),
height=c(180, 162, 175),
stringsAsFactors=FALSE)
加选项stringsAsFactors=FALSE 可以避免将字符型列转换成因子
如果数据框的某一列为常数,可以在data.frame() 调用中仅给该列赋一个值,生成的结果会自动重复这个值使
得该列与其他列等长。
nrow(d) 求d 的行数,ncol(d) 或length(d) 求d 的列数。
names(d) 或colnames(d) 可以访问/修改列名
2. 合并/排序
排序:order函数,见【数据和运算函数】——数值型运算——排序函数
合并:
横向:
merge(A, B, by=c("colname1", "colname2")); by=重复的列
cbind (A, B)
纵向:rbind (A, B)
3. 访问元素/取子集(drop=FALSE)
数据框可以用矩阵格式访问,如
d[2,3]
## [1] 162
访问单个元素。
d[[2]]
## [1] 30 35 28
访问第二列,结果为向量。
(为了提取一列为向量应使用双方括号格式或$格式,勿用tibble)
或者前后用attach和detach,就直接用变量名不用$了
按列名访问列可用如
d[["age"]]
## [1] 30 35 28
d[ ,"age"]
## [1] 30 35 28
d$age
## [1] 30 35 28
>myvars<- c("q1", "q2", "q3", "q4", "q5")
>newdata<- leadership[myvars]
>myvars<- paste("q", 1:5, sep ="")
>newdata<- leadership[myvars]
可以同时取行子集和列子集
4. tibble类型
一种改进的数据框。readr 包的read_csv() 函数是read.csv() 函数的一个改进版本,
它将CSV文件读入为tibble 类型
用as_tibble() 可以将一个数据框转换为tibble,
dplyr 包提供了filter()、select()、arrange()、mutate()等函数
用来对tibble 选取行子集、列子集,排序、修改或定义新变量
用tribble ( ) 可以按类似于CSV 格式输入一个tibble, 如
tribble(
~`序号`,~`收缩压`,
1,145,
5,110,
6,NA,
9,150,
10,NA,
15,115
) |> knitr::kable()
read_csv() 也支持从一个多行字符串直接读入数据,如:
readr::read_csv(" 序号, 收缩压
1,145
5,110
6,NA
9,150
10,NA
15,115
") |> knitr::kable()
R语言基础(10)——基本数据管理
advancer
北京大学金融学+心理学学生一枚~
变量的创建/重编码/重命名
使用原有变量创建新变量:
直接创建:dataframe$newcol1 = dataframe$oldcol1 + dataframe$oldcol2
transform函数
dataframe <- transform(dataframe, newcol1 = oldcol1 + oldcol2, newcol2 = oldcol1 - oldcol2)
3. mutate函数
dataframe <- mutate(dataframe, newcol1 = oldcol1 + oldcol2)
dataframe <- mutate(dataframe, newcol2 = oldcol1 - oldcol2)
重编码(将原有变量分类等创建新变量)
分别进行
leadership$agecat agecat[leadership$age > 75] <-"Elder"
2. 用within函数批量进行
dataframe <-within(dataframe, {
agecat[age > 75] <-"Elder"
agecat[age >= 55 & age <= 75]<-"Middle"})
重命名
1. >library(plyr) # 或者 library(reshape)
>rename( dataframe , oldname="newname", oldname="newname")
注意这个函数这时并没有改变 dataframe 而是 返回了一个新的数据框
不同包中的同名函数可能调用方式、返回方式都不一样:
>library(dplyr) # 后边加载的包里边的函数会屏蔽前面的
>rename( dataframe , newname= oldname , newname= oldname, …)
为了明确调用不发生混淆 dplyr:: rename( …
2. names() 函数
>names (leadership)[2] <-"testDate"
>names (leadership)[6:10] <- c("item1", "item2", "item3", "item4", "item5")
缺失值(NA、NAN)
NA是不可用的缺失值,
NAN是不可能出现的值(如0做除数)
判断:is.na()
参与计算也产生缺失值
计算时排除缺失值: na.rm = TRUE
删除含有NA的行/列:newdata <- na.omit(data)
删除变量
删除第8和第9列(变量q3&q4):
>newdata <- leadership[ c(-8, -9) ]
或者直接赋值NULL :
>leadership$q3 <- leadership$q4 <- NULL
R语言基础(10)——基本数据管理(2)
advancer
北京大学金融学+心理学学生一枚~
合并、排序
排序:order函数,见【数据和运算函数】——数值型运算——排序函数
合并:
merge(A, B, by=c("colname1", "colname2"))
by=重复的列
merge(data_A, data_B, by=c(colname1,colname2,...), all=___ )
all=TRUE 对应:完整合并,将返回所有匹配与未匹配的数据
cbind (A, B)
纵向:rbind (A, B)
筛选某些行进入观测
1) 筛选:
which( )函数
> dataframe [which (dataframe$colname1 + 条件1 & dataframe$colname2 + 条件2 , ]
> 返回行 ID
which可以省略,直接方括号[]取
2) 选入观测,subset() 的应用
参数:数据框;筛选行的条件(变量值);保留哪几列(变量名)(select = )
newdata<- subset(leadership, age >= 35 | age < 24, select=c(q1, q2, q3, q4))
或select=gender:q4)
样本抽取
sample 函数 , replace=FALSE 表示不放回
从leadership数据集中随机抽取一个大小为3的样本:
mysample <- leadership[sample(1:nrow(leadership), 3, replace=FALSE),]
其他实用函数
R语言基础(11)——循环&条件执行
advancer
北京大学金融学+心理学学生一枚~
1. 循环
在处理大数据集中的行和列时,R中的循环可能比较低效费时。
最好应用R中的内置数值/字符处理函数和apply族函数。
循环中的概念:
语句statement:一句 或 使用;间隔在{}中的多句
条件cond:条件判断表达式
表达式expr:针对序列的求值语句
序列seq:数值/字符串序列
for 结构
for (var in seq) statement 如:
for (i in 1:10) print("Hello")
while结构
while (cond) statement 如:
i <- 10
while( i>0 ) { print("Hello") ; i<- i-1}
2. 条件
if-else结构
• if (cond) statement
• if (cond) statement1 else statement2
如:
if (is.character(grade)) grade <- as.factor(grade)
if (!is.factor(grade)) grade <- as.factor(grade) else print("Grade already is a factor")
ifelse结构: if-else结构的紧凑形式
• ifelse (cond, statement1, statement2)
• 与 if (cond) statement1 else statement2 功能相同
如:
>ifelse(score > 0.5, print("Passed"), print("Failed"))
>outcome <- ifelse (score > 0.5, "Passed", "Failed")
switch结构:根据表达式的值,选择执行
switch (expr, list)
expr 为表达式,其值或为一个 整数值 或为一个 字符串; list 为一个列表。
参数 list 是有名定义 时,则当 expr 等于元素名 时,返回变量名对应的值,否则没有返回值。
自定义函数
myfunction <- function(arg1,arg2, ... ){
statements
return(object)
}
R语言基础(12)——日期和时间
advancer
北京大学金融学+心理学学生一枚~
1. 数据类型:
Date:日期,一般用整数保存,数值为从1970-1-1 经过的天数(可以加减整数,作为天数加减)
POSIXct:把日期时间保存为从1970 年1 月1 日零时到该日期时间的时间间隔——有符号的整数的 秒数(可以加减一定秒数)
POSIXlt:把日期时间保存为一个包含年、月、日、星期、时、分、秒等成分的列表,所以求这些成分可以从POSIXlt 格式日期的列表变量中获得。
年份是减去1900后的数值,mon(月份)是从0开始
>lt >c (1900 + lt$year , lt$mon+1 , lt$mday, lt$hour, lt$min, lt$sec)
[1] 1980 9 30 10 11 12
2. 生成:
as.Date():可以把多个yyyy-mm-dd 或yyyy/mm/dd 格式的字符串直接转换为Date类型,其他格式可以指定 "format=",可以先定义一个字符串为格式(PPT2-P24)
as.POSIXct():把多个年月日格式的日期转换为R 的标准日期
3. 扩展包lubridate
3.1 创建和转换:
today() 和Sys.date() 返回当前日期
now() , date() 和Sys.time() 返回当前日期时间 (CST是时区,这里使用了操作系统提供的当前时区)
可以用tz= 指定时区
>with_tz (meeting, "GMT")
>mistake < force_tz (meeting, "UTC")
unclass() 函数将时间长度数据的类型转换为以秒为单位的普通数值
ymd(), mdy(), dmy() 将输入的字符型向量转换为日期型向量
添加hms、hm、h 等后缀,可以用于将特定格式的字符串转换成日期时间。如:
ymd_hms("1998-03-16 13:15:45")
## [1] "1998-03-16 13:15:45 UTC"
ymd (20110101)或ymd("2011-01-01")
make_date(year, month, day) 可以从输入的三个数值生成日期向量
make_datetime(year, month, day, hour, min, sec)
as_date() 可以将日期时间型转换为日期型
as_datetime() 可以将日期型数据转换为日期时间型
as.character() 函数把日期型数据转换为字符型
用format 选项指定显示格式,
如:
as.character(x, format='%m/%d/%Y')
%A是星期几
3.2 取出/改变/赋值 日期型或日期时间型数据中的组成部分:
• year() 取出年
• month() 取出月份数值
• mday() 取出日数值
• yday() 取出日期在一年中的序号,元旦为1
• wday() 取出日期在一个星期内的序号,但是一个星期从星期天开始,星期天为1, 星期一为2,星期六为7。
• hour() 取出小时
• minute() 取出分钟
• second() 取出秒
update() 函数中可以用year, month, mday, hour, minute, second 等参数修改日期的组成部分
3.3 日期舍入计算
floor_date()——舍去
round_date()——取入
ceiling_date()——四舍五入(最近)
unit= 指定一个时间单位进行舍入。
时间单位为字符串,如seconds, 5 seconds, minutes, 2 minutes, hours, days, weeks, months, years 等。
如果单位是星期,会涉及到一个星期周期的开始是星期日还是星期一的问题。用参数week_start=7 指定开始是星期日,week_start=1 指定开始是星期一。
3.4 日期四则运算(加减乘除)
数据类型:
• 时间长度(duration),按整秒计算
• 时间周期(period),如日、周
• 时间区间(interval),包括一个开始时间和一个结束时间
POSIXct类型 日期时间之间可以相加减:
两个日期不能直接计算。给一个日期加减一定天数,可以通过加减秒数实现
as.POSIXct(c('1998-03-16 13:15:45')) + 3600*24*2
## [1] "1998-03-18 13:15:45 CST"
as.duration(d1-d2):处理两个日期之间的差别,得到的数据类型是difftime
或者直接d1-d2
difftime(time1, time2, units='days') 计算用time1 减去time2 的天数。函数结果用c() 包裹以转换为数值, 否则会带有单位。
interval(time1, time2):计算时间间隔
等价于time1 % -- % time2
可以在时间长度之间相加,也可以对时间长度乘以无量纲数
可以给一个日期加或者减去一个时间长度,结果严格按推移的秒数计算
dseconds(), dminutes(), dhours(), ddays(), dweeks(), dyears() 函数可以直接用数值生成时间长度类型的数据(以秒数为单位)
seconds(), minutes(), hours(), days(),weeks(), years() 函数可以生成以日历中正常的周期为单位的时间长度,不需要与秒数相联系。
可以用于时间的前后推移。这些时间周期的结果可以相加、乘以无量纲整数
R语言基础(12)——绘图(1)
• 自定义符号、线条、颜色和坐标轴
颜色
• 可以通过颜色下标、颜色名称、十六进制颜色值、RGB值或HSV值来指定颜色。
例如,col=1、col="white"、col="#FFFFFF"、col=rgb(1,1,1)和col=hsv(0,0,1)都表示白色。
• 函数rgb()可基于红—绿—蓝三色值生成颜色,而hsv()则基于色相—饱和度—亮度值来生成颜色。
• 创建连续型颜色向量的函数,包括rainbow()、heat.colors()、terrain.colors()、
topo.colors()以及cm.colors()
例如,rainbow(10)可以生成10种连续的“彩虹型”颜色。多阶灰度色可使用gray()函数生成
• 标注文本和标题
文本
par (font.lab=3, cex.lab=1.5, font.main=4, cex.main=2)
之后创建的所有图形都将拥有斜体、1.5倍于默认文本大小的坐标轴标签,
以及粗斜体、2倍于默认文本大小的标题
• 控制图形维度 (尺寸和边界)
• par(pin=c(4,3), mai=c(1,.5, 1, .2))
• 生成一幅4英寸宽、3英寸高、上下边界为1英寸、左边界为0.5英寸、右边界为 0.2英寸的图形。
• 组合多个图形
函数par()或layout()
可以在par()函数中使用图形参数mfrow=c(nrows, ncols)来创建按行填充的、行数为nrows、列数为ncols的图形矩阵。或使用mfcol =c(nrows, ncols)按列填充矩阵。