目录
1.1 工作环境
1.1.1 R的历史与发展
1.1.2 R的资源
1.1.3 RGui
1.1.4 Rstudio
1.1.5 为什么选择R
1.1.6 Tips for R
1.1.6 Tips for R
1.2 工作环境
1.2.1 对象
1.2.2 数据类型
1.2.3 [向量]
1.2.4 [矩阵]和数组
1.2.5 [列表]
1.2.6 [数据框]
1.2.7 因子与表
1.2.8 表达式与公式
1.3 [对象的运算]
1.3.1 对象类型转换
1.3.2 运算符
1.3.3 运算函数
1.4 常用命令
1.4.1 工作目录与R内存
1.4.2 加载与保存
1.4.3 显示
1.4.4 挂接
setwd("E:/大二下2020春/3R语言/attached for 1 and 2")
rm(list=ls()) #清除当前空间中所有对象
rm(list=ls()) #清除当前空间中所有对象
#(1)numeric
x<-12;length(x);class(x);
#(2)character
z<-"Display \"a\" string" #字符需要用单双引号引起来
w<-'Display "b" string' #双引号中的双引号需要用反斜杠'\'区分开
cat(z,w) #concatenate and print 连接并打印
#(3)logical
y<- TRUE;class(y);length(y);
#(4)complex
m<-2+3i;class(m);length(m); #长度为1
#(5)时间型,日期/时间变量(***)
(dates <- c("01/27/2016", "02/27/2016", "01/14/2016", "02/28/2016",
"02/01/2016")) #最外层括号显示运行结果
is.numeric.Date(dates) #是否是数值日期变量
is.character(dates) #是否是字符日期变量
(date <- as.Date(dates, format = "%m/%d/%Y"))
#按照(format月日年)的格式*读入*日期,进行年月日的日期变量转换(输出:年-月-日)
#as.Date()只能转换“年月日星期”的字符日期,不能转换具体到“时分秒”的字符时刻
#日期变量,可以直接做运算
(dateform <- format(date, "%m/%d/%Y")) # 日期变量,转换为“任意指定格式”的*字符串*
class(date)
#将“字符时间”,转换为“可计算的时间变量”(**)
x <- c("2016-02-08 10:07:52", "2016-08-07 19:33:02")
is.character(x) # 判定是否为字符型变量
as.POSIXlt(x, tz = "", format = "%Y-%m-%d %H:%M:%S")
#POSIXct格式的时间:以有符号整数形式存储,表示从1970-01-01到该时间点经过的秒数
#POSIXlt格式的时间:以字符串形式存储,包含年月日等
# "05/27/84" 对应格式 "%m/%d/%y"
# "May 27 1984" 对应格式 "%B %d %Y"
#CST,为中国标准时区tz
(x <- strptime(x, "%Y-%m-%d %H:%M:%S", tz = ""))
# 按“年月日 时分秒”转换为时间变量,与as.POSIXlt()等效、但格式略有不同
#将“时间变量”转换为“字符日期”(***)
strftime(x, format = "%m/%d/%Y") #按format设定个事逆转为字符串日期,不保留具体的时分秒
format(x, "%Y-%m-%d %a %b") #输出格式,转换成format指定的字符串日期
#缩写星期,简化月份
seq(1, -9) # 只给出首项和尾项数据,by自动匹配为1或-1
seq(1, -9, length.out = 5) # 给出首项、尾项、长度,自动计算等差
seq(1, -9, by = -2) # 给出首项、尾项、步长,自动计算长度
seq(1, by = 2, length.out = 10) # 给出首项、步长、长度,自动计算尾项
#by步长,不引起混淆是length.out可以记为length
#“中括号 + 下标”索引(元素的值)
vector <- c(11, 12, 13, 14)
vector[c(1, 4)] #11 14
vector[-c(1:3)] #14
vector[c(TRUE, TRUE, FALSE, FALSE)] #11 12
#名称索引
names(vector) <- c("one", "two", "three", "four") #命名字
vector[c("one", "two", "four")] #11 12 14
#subset索引
vector <- c(11, 12, 13, 14)
subset(vector, vector > 11 & vector < 14) # 检索向量中满足条件的元素
#which索引“满足逻辑条件的元素位置”(***)
vector <- c(11, 12, 13, 14)
which(vector == 13)
which(vector == c(11, 14)) # 向量中等于11和14的元素所在的位置
which(vector != 12)
which(vector > 12 & vector < 14)
which.max(vector)
which.min(vector)
## match方式索引
vector <- c(11, 12, 13, 14)
match(vector, c(14, 11, 13)) # 2 NA 3 1
match(vector, c(11, 14)) # 1 NA NA 2
vector[match(vector, c(11, 14))] # 11 NA NA 12
## 值匹配符
vector <- c(11, 12, 13, 14)
c(11, 18) %in% vector #TRUE FALSE 11在vector中,18不在
##增
x<-x <- c(1, 2, 3, 4)
(x <- c(x, c(7, 8, 9)))
(x <- append(x, 5:6, after=4)) #1 2 3 4 5 6 7 8 9 在4后添加5和6
##删
x <- c(1, 2, 3, 4,5,6,7)
(x <- x[-c(3:5)]) #删除3,4,5号元素
##sort
x <- c(5, 6, 8, 7, 4, 1, 9)
x1 <- c("B", "A", "C")
x2 <- c(3, 2, NA, 1, 4, 5)
sort(x) # 1 4 5 6 7 8 9
sort(x, decreasing = TRUE) # 9 8 7 6 5 4 1
sort(x1) # "A" "B" "C"
sort(x2, na.last = TRUE) # 1 2 3 4 5 NA
##order返回元素
x <- c(5, 6, 8, 7, 4, 1, 9)
order(x) #4原来在5的位置 6 5 1 2 4 3 7
x[order(x)] #1 4 5 6 7 8 9
## 创建矩阵
x <- c(1:10) # 创建一个向量,作为矩阵的数据
(a <- matrix(x, nrow = 5, ncol = 2, byrow = T))
# 创建一个矩阵,定义矩阵的行数为5、列数为2,按行读取数据
(b <- matrix(x)) # 10行1列
dim(b) <- c(5, 2) # 5行2列
b
(c <- matrix(x, nrow = 5, ncol = 2, byrow = F,
dimnames = list(c("r1", "r2", "r3", "r4", "r5"), c("c1","c2"))))
length(c)
##矩阵索引/筛选:“中括号 + 下标范围”
x <- c(1:10)
(a <- matrix(x, nrow = 5, ncol = 2, byrow = F,
dimnames = list(c("r1", "r2", "r3", "r4", "r5"), c("c1","c2"))))
a[1, ] # 检索第一行
a[, 1] # 检索第一列
a[c(3:5), ] # 检索第3-5行
a[-c(2, 4), 2] # 默认drop值为真,将返回一个“维数尽可能低的对象”(此处为向量)
#r1 r3 r5
# 6 8 10
a[-c(2, 4), 2, drop = F] #去掉第2,4行,提取第二列,但索引是单因子矩阵,不允许降维
# c2
#r1 6
#r3 8
#r5 10
a[a[, 1]>3, ] # 筛选条件为“比较表达式”时,依逻辑布尔值为真、筛选出“需要的矩阵的行或
列”
##矩阵转换为向量
x <- c(1:10)
(a <- matrix(x, ncol = 2, nrow = 5, byrow = T))
(b <- as.vector(a)) # 将矩阵“转化为向量”
#[1] 1 3 5 7 9 2 4 6 8 10
matrix(b, nrow=2)
# [,1] [,2] [,3] [,4] [,5]
#[1,] 1 5 9 4 8
#[2,] 3 7 2 6 10
##矩阵转换为向量
(a <- matrix(1:10, nrow = 5, ncol = 2))
(a1 <- rbind(a, c(11,12))) # 按行的形式合并
(a2 <- cbind(a, c(11:15)))
(a3 <- rbind(a, 1)) #短向量元素不足,按循环补齐后绑定
(a4 <- cbind(a, 1))
(a5 <- a[-1, ]) # 删除第一行
(a6 <- a[, -2]) # 删除第二列
##求和和均值
colSums_A <- colSums(A)
colMeans_A <- colMeans(A)
rowSums(A)
rowMeans(A)
#没有rowvar()函数,可以用apply()函数解决
(A <- matrix(c(1:9), ncol = 3, nrow = 3))
diag_A <- diag(A) # 矩阵取对角(1,5,9)
diag(diag_A)
# [,1] [,2] [,3]
#[1,] 1 0 0
#[2,] 0 5 0
#[3,] 0 0 9
##生成三角矩阵
(Tri <- matrix(1:25,5,5)) # 简化形式、指定行/列
(upper.tri(Tri))
Tri[upper.tri(Tri)] <- 0
Tri
x <- c(1:30)
dim1 <- c("A1", "A2", "A3")
dim2 <- c("B1", "B2", "B3", "B4", "B5")
dim3 <- c("C1", "c2")
(a <- array(x, dim = c(3, 5, 2), dimnames = list(dim1, dim2, dim3)))
g <- "My List" ; class(g)
h <- c(25, 26, 18, 39) ; class(h)
j <- matrix(1:10, nrow = 5) ; class(j)
(mylist <- list(title = g, ages = h, j))
summary(mylist)
names(mylist)
unlist<-unlist(mylist)
# title ages1 ages2 ages3 ages4
#"My List" "25" "26" "18" "39" "1" "2"
#
# "3" "4" "5" "6" "7" "8" "9"
#
# "10"
mode(unlist) ; class(unlist) ; typeof(unlist)
# "character" 一般情况下全部转换为字符向量
(data <- list(a = c(1, 2, 3, 4), b = c("one", "two", "three"),
c = c(TRUE, FALSE), d = (1 + 2i)))
#Lt[[下标]]:双重中括号,取出的是“列表元素”(不再含元素/变量名) Lt[["a"]]同理
data[[1]] ; class(data[[1]])
#Lt[下标或下标范围]:单重中括号,取出的是“子列表” Lt["a"]同理
data[1] ; class(data[1])
#去第一列第2,4元素值
data[[1]][c(2, 4)]
(data <- list(a = c(1, 2, 3, 4), b = c("one", "two", "three"),
c = c(TRUE, FALSE), d = (1 + 2i)))
##添加
#赋值语句
data$e<-5:8
#连接函数
(data1 <- c(data, list(e = c(5, 6, 7, 8))))
(data2 <- c(data, e = list(c(5, 6, 7, 8))))
##更改(对已有操作同上即为更改)
##删除(赋值NULL)
data$b <- NULL ; data
### 6.数据框(***):创建、索引、编辑
## 1) 创建数据框:每列数据类型可不同,但长度必须相同
## 数据框,是一种特殊列表,以“矩阵形式”存放数据
#eg1
data_iris <- data.frame(Sepal.Length = c(5.1, 4.9, 4.7, 4.6),
Sepal.Width = c(3.5, 3.0, 3.2, 3.1),
Petal.Length = c(1.4, 1.4, 1.3, 1.5),
Petal.Width = rep(0.2, 4))
data_iris
#eg2
(data_matrix <- matrix(1:8, c(4, 2))) # 创建一个矩阵
(data.frame(data_matrix))
##列索引
data_iris[, 1] # 矩阵索引第一列(有逗号—>矩阵方式)
data_iris[[1]] # 列表索引第一列
data_iris$Sepal.Length # 列表按元素名索引
data_iris["Sepal.Length"]
# Sepal.Length
#1 5.1
#2 4.9
#3 4.7
#4 4.6
class(data_iris["Sepal.Length"]) #"data.frame"
##行索引(用矩阵的方式)
##单个元素索引
data_iris$Sepal.Length[1] # 先索引出列,取第一个
data_iris["Sepal.Length"][1] # 子数据框为一个元素
# Sepal.Length
#1 5.1
#2 4.9
#3 4.7
#4 4.6
## subset函数索引(**)
subset(data_iris, Sepal.Length < 5) #只有第一行大于5
data_iris[data_iris$Sepal.Length < 5, ] #类似矩阵处理
(data_iris <- rbind(data_iris, list(5.0, 3.6, 1.4, 0.2)))
(data_iris <- cbind(data_iris, Species = rep("setosa", 5)))
##查询
names(data_iris) # 查看数据框的“列名” ;注意,不是“行名”
##修改
names(data_iris)[1] <- "sepal.length" #修改列名
rownames(data_iris) <- c("one","two","three","four", "five") #修改行名
### 7. 因子(*):类别 + 有序
## 1) 创建因子
# 离散型变量,往往用于“分类、或计数”,需要借助因子对象来分析计算
# 因子,可简单视为“附加了额外信息的[向量]”,分为“类别 + 有序”
factor(1:4)
factor(1:4,levels=1:2) #数字1仅表示因子水平1
factor(c((1:4),(4:1)),labels=c("A","B","C","D"))# labels:因子水平的标签、用数字或字
母无本质区别
(ff <- factor(substring("statistics", 1:10, 1:10), levels = letters))# 将文本/字符串statistics“逐个拆分”为单个字符、创建因子向量,水平为26个小写字母
(f <- factor(ff))
ff[, drop = TRUE] # 等价于 f <- factor(ff)
factor(letters[1:20], labels = "letter")
# 创建因子向量,“水平名称/标签”为letter
(z <- factor(LETTERS[7:1], ordered = TRUE))
gl(n, k, length) n为水平数,k为重复次数
## 创建“水平/level反复重复”的因子:gl(n, k, length)
gl(3, 3)
#[1] 1 1 1 2 2 2 3 3 3
#Levels: 1 2 3
gl(2, 3, labels = c("TRUE","FALSE")) # 生成水平为“TRUE”和“FALSE”,每个水平重复3次的因
子序列
#[1] TRUE TRUE TRUE FALSE FALSE FALSE
#Levels: TRUE FALSE
gl(2, 1, 10)
#[1] 1 2 1 2 1 2 1 2 1 2
#Levels: 1 2
gl(2, 2, 10)
#[1] 1 1 2 2 1 1 2 2 1 1
#Levels: 1 2
gl(3, 3, ordered = TRUE) # 生成水平数为3,每个水平重复3次的有序因子序列
#[1] 1 1 1 2 2 2 3 3 3
#Levels: 1 < 2 < 3
## 2) 水平的频数统计,因子存储方式
status <- c("Poor", "Improved", "Excellent", "Excellent", "Poor", "Excellent")
#字符串
(status.factor <- factor(status, ordered = TRUE)) # 创建有序因子序列,按英文首字母、排
序因子水平
levels(status.factor)
#[1] "Excellent" "Improved" "Poor"
table(status.factor) #频数分布表
#status.factor
#Excellent Improved Poor #按因子个数可以扩展为2维,3维
# 3 1 2
class(status.factor) # 查看“数据对象的类型”
#[1] "ordered" "factor"
mode(status.factor) # 储存是整数
#[1] "numeric"
typeof(status.factor) # 因子是按“整数”*存储*的,仅仅是“计数”分类的类别
#[1] "integer"
as.numeric(status.factor)
#[1] 3 2 1 1 3 1
set.seed(12345) # 设置随机数的种子数
p1 <- rnorm(100)
p2 <- runif(100)
model.lm <- lm(p2~p1+I(p1^2)+I(p1^3))
# 公式,用操作符“~”简示:y~x
# 多项式拟合时:二次以上的项,放入“ I() ”中
summary(model.lm)
(M <- matrix(1:12,nrow=3,ncol=4))
mode(M) # 模式:基本数据类型为“数值型”
class(M) # 类:构造的对象类型为“矩阵” 数据对象结构的分类->面向对象
typeof(M) # 类型:细化数据类型为“整型” 类似mode,但更精细
is.matrix(M) # 判断数据对象类型
is.numeric(M)
M.frame <- as.data.frame(M) # 默认:行是“观测点”,列为“元素/变量/字段/组件名”
#生成上三角矩阵 z <- matrix(c(11:19),ncol=3)
z[lower.tri(z)] <- 0
x <- c(1,5,4,7,9)
order(x)
#[1] 1 3 2 4 5
append(x, 2:3, after=2) # 在x的“指定下标位置”处、添加新的向量元素2:3
#[1] 1 5 2 3 4 7 9
(A <- matrix(sample(1:100, 16), ncol=4))
aperm(A,c(2,1)) # 数组"维度转换"函数,改行效果同转置
solve(A) # 矩阵求逆
##矩阵合并
(x <- runif(10,-1,1))
(y <- rnorm(10,0.5,1))
(xy <- cbind(x,y))
# x y
# [1,] 0.4480469 0.8775397
# [2,] 0.7246093 2.8934495
# [3,] -0.9006359 1.6335336
# [4,] -0.1471617 0.3429806
# [5,] 0.2373294 2.1354869
# [6,] -0.3626603 0.4452315
# [7,] -0.4686020 1.1615278
# [8,] 0.4733459 0.7969101
# [9,] -0.5738643 3.1170615
#[10,] -0.2144737 -0.7054672
##apply函数
(x <- matrix(1:20, ncol = 4))
# [,1] [,2] [,3] [,4]
#[1,] 1 6 11 16
#[2,] 2 7 12 17
#[3,] 3 8 13 18
#[4,] 4 9 14 19
#[5,] 5 10 15 20
apply(x, 1, mean) # 计算各行的均值
apply(x, 2, sd) # 计算各列标准差
f1 <- factor(rep(1:4,length=14),levels=1:5,labels=c("A","B","C","D","E"))
# 产生长度为14的因子对象,5个因子水平的标签、设为ABCDE
f1
# [1] A B C D A B C D A B C D A B
#Levels: A B C D E
(x2 <- c(1:14))
tapply(x2,f1,sum)
# f1是用于分类的“因子对象”,其长度与“向量x2”的[长度一致],以便一一对应(*)
# 先依照f1对x2进行分组,每组对应一个因子水平,对分组后x2的子向量,应用函数sum
# 如A因子水平对应的子向量元素为1,5,9,13,它的和为28
# 默认返回简化结果table而不是list
# A B C D E
#28 32 21 24 NA
aggregate(x2, by=list(f1),sum) #aggregate还可以对数据框查找
# Group.1 x
#1 A 28
#2 B 32
#3 C 21
#4 D 24
by(x2, f1, sum)
#f1: A
#[1] 28
#----------------------------------------------------
#f1: B
#[1] 32
#----------------------------------------------------
#f1: C
#[1] 21
#----------------------------------------------------#f1: D
#[1] 24
#----------------------------------------------------
#f1: E
#[1] NA
tapply(x2,f1,sum,simplify=FALSE)
#$A
#[1] 28
#
#$B
#[1] 32
#
#$C
#[1] 21
#
#$D
#[1] 24
#
#$E
#NULL
(L1 <- list(a=1:20, b=runif(30,-2,5), d=matrix(c(1:20),ncol=4)))
lapply(L1,quantile)
#对列表的“各个元素/字段/组件”,分别求分位数函数运算 (矩阵也是一种向量)(看做)
#$a
# 0% 25% 50% 75% 100%
# 1.00 5.75 10.50 15.25 20.00
#
#$b
# 0% 25% 50% 75% 100%
#-1.90874464 -0.05957505 1.76850576 3.62932450 4.88275599
#
#$d
# 0% 25% 50% 75% 100%
# 1.00 5.75 10.50 15.25 20.00
(L1 <- list(a=1:20, b=runif(30,-2,5), d=matrix(c(1:20),ncol=4)))
sapply(L1,quantile,simplify=FALSE,use.names=FALSE)
# 返回一个列表(此时同lapply)
sapply(L1,quantile,simplify=TRUE,use.names=FALSE) #返回矩阵结果
# a b d
#0% 1.00 -1.6077317 1.00
#25% 5.75 -0.1072232 5.75
#50% 10.50 1.4300179 10.50
#75% 15.25 2.5263637 15.25
#100% 20.00 4.6659900 20.00
(L2 <- list(c("a", "b", "c"), c("A", "B", "C")))
sapply(L2, paste, 1:3, sep="",simplify = TRUE) #sep为空表示没有a和1中无分隔符
# [,1] [,2]
#[1,] "a1" "A1"
#[2,] "b2" "B2"
#[3,] "c3" "C3"
sapply(L2, paste, 1:3, simplify = F) #sep默认为空格
#[[1]]
#[1] "a 1" "b 2" "c 3"
#
#[[2]]
#[1] "A 1" "B 2" "C 3"
##下载包
install.packages("quantmod")
##加载包
library(xts)
library(zoo)
library(TTR)
library(quantmod) # 加载quantmod的包
##下载包
install.packages("car")
##加载包
library(carData)
library(car)
some(iris) #iris是一个自带的数据集
(x <- rnorm(10))
(y <- matrix(1:20, nrow=5))
(z <- paste("x", 1:10, sep=''))
ls() # 查看当前空间中已存在的对象
save.image() # 保存工作空间所有对象,生成“ .RData”文件
save(x,y,file="S.RData") # 仅保存部分“指定的对象”
load(file="S.RData")
E1 <-3.1415926535
E2 <-3.1415926535
(E1.r <- round(E1,digits=4)) # 四舍五入,小数点后保留四位
E1.r*1000000
#[1] 3141600
options(digits=4) ; E2 # 显示四位数字,但未作四舍五入
E2*1000000
#[1] 3141593
#4.挂接命令
df <- data.frame(name=c("ZhangSan","XiaoHong","LiSi","XiaoLan"),
sex=c("M","F","M","F"),age
=c(20,21,19,20),weight=c(110,90,128,102))
attach(df) # 将“数据框/列表中的变量/元素”、直接“挂接到内存”
mean(age) #直接调用元素/字段名 (不再需用数据框/列表名引用),作为对象来运算
detach(df)
#attach+mean的效果与下列相同
mean(df$age)
#[1] 20
##加载包
library(quantreg)
##释放包
detach("package:quantreg") #去掉挂接、释放内存,同时避免“不同包、相同函数的冲突”