—上课笔记,以及自己的补充。
数值型、字符型、逻辑型、复数型(略)等
X<-3+3; X #“<-”为赋值符,“;”用于间隔一行中的命令,结果同上句
assign("X",3+3); X = 3+3; 3+3-> X #赋值的其他方法,一般不用
Wing <- c(59, 55, 53.5, 55, 52.5, 57.5, 53, 55) #输入向量,向量是R的重要数据结构(见#1.3)
mode(Wing); length(Wing) #查看对象的两个内在属性:类型与长度
typeof(Wing) #查看类型,比mode分得更细
date() 提取当前系统时间.
与之类似的是: Sys.time()
paste("Today is", date()) #拼接字符串;
labs<-paste("X", 1:6, sep = "_"); labs
Sys.time() # "2020-05-17 20:03:18 CST"
format(Sys.time(), "%a %b %d %H:%M:%S %Y") #"周日 5月 17 20:02:18 2020"
paste (…, sep = " ", collapse = NULL)
paste0(…, collapse = NULL) 没有分隔符
功能:转换为字符后,拼接成向量
#当传入的是单个向量时,paste(),paste0(),as.character() 结果一样
paste0(1:12)
paste(1:12) # same
as.character(1:12) # same
(nth <- paste(1:12, c("st", "nd", "rd", rep("th", 9))))
# [1] "1 st" "2 nd" "3 rd" "4 th" "5 th" "6 th" "7 th" "8 th" "9 th" "10 th" "11 th" "12 th"
(nth <- paste0(1:12, c("st", "nd", "rd", rep("th", 9)))) #没有分隔符
# [1] "1st" "2nd" "3rd" "4th" "5th" "6th" "7th" "8th" "9th" "10th" "11th" "12th"
# 注意在进行字符串拼接的时候,循环根据最长字符串来定
paste0(1:10,c("a","b","c")) # [1] "1a" "2b" "3c" "4a" "5b" "6c" "7a" "8b" "9c" "10a"
#可设置参数sep,更改字符间的分隔符
paste(month.abb[1:5],c(1:5),sep = "-->")
#[1] "Jan-->1" "Feb-->2" "Mar-->3" "Apr-->4" "May-->5"
#要将输出折叠为单个字符串,只需设置collapse
paste0(nth, collapse = ", ")
#[1] "1st, 2nd, 3rd, 4th, 5th, 6th, 7th, 8th, 9th, 10th, 11th, 12th"
#若要拼接的对象长度为1,选择sep参数,而非collapse
paste("1st", "2nd", "3rd", collapse = ", ") # probably not what you wanted. "1st 2nd 3rd"
paste("1st", "2nd", "3rd", sep = ", ") #"1st, 2nd, 3rd"
#还可以同时使用参数 sep, collapse
paste(month.abb, nth, sep = ": ", collapse = "; ")
运算符 | 描述 |
---|---|
x&&y | 标量的逻辑“与”运算 |
x||y | 标量的逻辑“或”运算 |
x & y | 向量的逻辑“与”运算(x、y以及运算结果都是向量) |
x|y | 向量的逻辑“或”运算(x、y以及运算结果都是向量) |
!x | 逻辑非 |
x %/% y | 整除,实际上得到的是商 |
x ^ y | 幂 |
x %% y | 模运算,实际上是取余数 |
Wing <- c(59, 55, 53.5, 55, 52.5, 57.5, 53, 55)
x <- c(T,F,TRUE); x #T即TRUE,F即FALSE,注意一定要大写!
x <- Wing>55; x #结果为逻辑向量TRUE FALSE FALSE FALSE FALSE TRUE FALSE FALSE
#逻辑运算符:<,<=,>,>=,==,!=,&,|,!
x <- c(1,1,0)
y <- c(0,1,0)
x|y #或
x&y #与
!x #非
#注意若是对向量使用 标量的运算符,则只会对第一个分量进行判断
x&&y
x||y
5%%2 #1
5%%3 #2
5 %/% 2
5 %/% 3
all(x) #判断逻辑向量中是否都为TURE
any(x) #判断逻辑向量中是否存在TURE
NA(缺失),NAN(不确定)Not a number,INF(无穷)
x<-c(0/1, 0/0, 1/0, NA); x
is.na(x) #注意0/0(NAN)在判断时也被认为是NA。类似还有is.nan(),is.finite(),is.infinite()
is.nan(x)
is.finite(x)
is.infinite(x)
expression
f<- expression(cos(pi*x+y^2+exp(y))) #输入二元函数(表达式)
D(f,"y") #求(偏)导数
f<- expression(x^3)
D(f,"x")
length(ex1 <- expression(1 + 0:9)) # 1
ex1
eval(ex1) # 1:10
length(ex3 <- expression(u, 2, u + 0:9)) # 3
mode(ex3 [3]) # expression
mode(ex3[[3]]) # call
sapply(ex3, mode ) # name numeric call
sapply(ex3, typeof) # symbol double language
rm(ex3)
1.2.6 数据类型的判断和转换
f <- function(x) { 1/x^2 } #输入一元函数
integrate(f, 1, 2) #求一元积分
integrate(f, 1, Inf) #求无穷积分
is.numeric(TRUE)
as.numeric( Wing>55 ) #将逻辑型强制转换为数值型,但x本身不变
T+2 #R将根据运算需要自动完成类型转换,结果为1+2=3
向量、数组、矩阵、列表、数据框等
Wing <- c(59, 55, 53.5, 55, 52.5, 57.5, 53, 55) #输入数据向量
#访问向量中的元素:
Wing[1] #查看第1个值,注意这里是方括号!下同。
Wing[c(1,3)] #查看第1,3个值
Wing[1:4] #查看前4个值,1:4表示序列1,2,3,4
Wing[-3] #查看除了第3个值以外的其它值
Wing[Wing>55] #查看Wing中大于55的元素,注意[]内可以是逻辑向量
X<-Wing; X[X>55]=55; X #将大于55的元素设置成55,这里为不改变Wing的值,另外使用了X
#数值向量的计算
Wing^2 #各元素加平方得到新的向量
sum(Wing) #求和,另有range,max,min,mean,median,var,sd等
exp(Wing) #计算以e为底的指数
which.min(Wing) #返回最小值的索引 5
#排序
sort(Wing) #向量排序,默认升序
sort.list(Wing) #下标顺序——按升序排列的元素在原向量中的下标,同order(Wing)
sort(Wing, decreasing = TRUE)
order(Wing) #下标顺序——按升序排列的元素在原向量中的下标. 返回的是索引
rank(Wing) #按升序排列的元素所在的排名,注意ties.method参数
注: rank与order都与排序有关,且结果往往都是1:n的一种排列,极易混淆。
rank只比较元素在向量中的大小,而order要同时考察大小和出现的先后次序,(返回排序后元素在原向量的下标)。正因order返回值是排序向量之下标,故A[order(A)]
将A排序,而B(order(A))
将B按A的大小排序(联动排序).
关于rank函数,rank,默认小的值,排名靠前.
rank(x, na.last = TRUE, ties.method = c(“average”, “first”, “last”, “random”, “max”, “min”))
参数ties.method处理元素值相等时的情况.
x <- c(1,2,3,2,1,0)
rank(-x) #rank(-x)大的值排名靠前,结果前和average情况一样,ties.method默认为 average
rank(-x,ties.method = "max") #5 3 1 3 5 6 取排名值大的
rank(-x,ties.method = "min") #4 2 1 2 4 6 取排名值大的
rank(-x,ties.method = "first") #4 2 1 3 5 6 位置靠前的大
rank(-x,ties.method = "last") #5 3 1 2 4 6 位置靠后的大
rank(-x,ties.method = "average") #4.5 2.5 1.0 2.5 4.5 6.0 平均
rank(-x,ties.method = "random") #5 2 1 3 4 6 随机
M <- vector(length = 3); M #注意参数名用法. 默认生成的是逻辑向量,False,长度为3
M[1] <- 59; M[2] <- 55; M[3] <- 53.5; M
1:4
seq(from=2, to=8, by=2) #by间隔
seq(2,8,length.out = 5) #length.out序列长度 参数可简写为 len=5,或length=5
#生成重复序列
rep(1:4, each=2, len=10) #1:4每个重复2次,总长10 rep---repeat
rep(1:4, each=2, times=3) #1:4每个重复2次,整个片断再重复3次
rep(1:4, c(4,3,2,1)) #1重复4次,2重复3次……
rep(1:4, 3) #1:4重复3次,3相当于times=3
rep(1:4, each = 2, len = 4) # first 4 only.
rep(1:4, each = 2, len = 10) # 8 integers plus two recycled 1's.
#给向量中元素加名
ages <- c(Li=33, Zhang=29, Liu=18);ages #方式一:创建时直接加名字
ages["Zhang"] #相当于ages[2]
ages <- c(33,29,18);
names(ages) <- c("Li","Zhang","Liu"); #方式二:创建后,再用names加名
ages["Zhang"] #结果同上
attributes(ages) #列出除两个内在属性(类型、长度)以外的其他属性
attr(ages,"names") #列出指定的属性
class(ages) #对于向量,结果为其中元素的类型
#生成序列可能用到的常量
LETTERS #26个大写字母
letters #26个小写字母
month.abb #12个月份的三字母缩写
month.name #12个月份的全称
array()/matrix() 数组是带多个下标的同类型元素的集合,矩阵是2维数组
B<-c(1:8, 10)
is.vector(B); is.array(B) #B是向量、非数组
dim(B) #向量没有维度 NULL
dim(B)<-9; B #若给向量赋予维度,向量就转化成了数组
is.vector(B); is.array(B) #B化为了1维数组
mode(B); class(B) #查看B的数据类型与构成:numeric,array
dim(B)<-c(3,3); B
is.array(B); is.matrix(B) #B化为了3*3的2维数组,即矩阵
mode(B); class(B) #查看B的数据类型与构成:numeric,matrix
#数值矩阵的运算
dim(B); nrow(B); ncol(B) #返回矩阵维数、行数和列数
det(B) #求行列式
t(B) #求矩阵转置
solve(B) #求逆 B %*% solve(B)=I_3 还可以解线性方程组Ax=B,x=solve(A,B)
eigen(B) #求特征值与特征向量,eigen(B)$values,eigen(B)$vectors分别提取特征值/向量
B%*%A #矩阵的乘法,注意,不是B*A,后者要求对应元素相乘
#验证Bx=lambda*x
(B %*% eigen(B)$vectors[,1]) & t((eigen(B)$values[1] %*% eigen(B)$vectors[,1]))
#简单的统计分析
sum(B); mean(B) #求矩阵元素之和、均值
rowSums(B); colSums(B) #逐行求和、逐列求和
rowMeans(B); colMeans(B) #逐行求均值、逐列求均值
apply(B,1,sum) #逐行求和,同rowSums(B),1表示对行计算
apply(B,2,mean) #逐列求均值,同colMeans(B),2表示对列计算
apply(B,c(1,2),sqrt) #逐元素开根,同sqrt(B)
注:一定要注意矩阵的乘法,用的是 %*%
#访问矩阵中部分元素
B<-c(1:8, 10)
B[,1] #第一列
B[1,] #第一行
B[1,1] #第一行、第一列
B[,2:3] #第二、三列
B[,-3] #除第三列外的元素
B[,c(-1,-3)] #除第一、三列外的元素
#给矩阵行、列加名
rownames(B) <- c("one", "two", "three") #设置行名
colnames(B) <- c("First", "Second", "Third"); B #设置列名
#上两句还可以在定义matrix时通过参数dimnames来设定 需要以列表的方式传入
B <- matrix(c(1:8,10),nrow = 3,ncol = 3,
dimnames = list(c("one", "two", "three"),
c("First", "Second", "Third")));B
#将矩阵拉直成向量
as.vector(B) #矩阵元素按列拉直成向量
dim(B)<-9 #效果同上
#将多个向量按列/行捆绑cbind/rbind,作成矩阵
Z <- cbind(Wing, Bone, Head, Weight); Z #按列捆绑,注意有列名
class(Z) # "matrix"
rbind(1:3, 4:6, c(7,8,10)) #多个等长向量捆绑成矩阵
cbind(1:4, 1:2)
列表是一种特别的对象集合,它可以由不同类型、不同构成的对象(元素)构造而成
定义格式:list(name_1=object_1, …, name_m=object_m)
#列表的定义、访问和修改
Lst <- list( #注意,一个命令可以写多行,在console窗口亦可
name="Fred",
wife="Mary",
no.children=3,
child.ages=c(4,7,9)
); Lst
class(Lst) #该对象为list类
is.list(Lst)#判断是否为list类,结果为真
Lst$name #访问name对象,同Lst[[1]]或Lst[["name"]]。注意有别于单括号(返回子列表)
Lst$income <- c(1980, 1600) #要修改或增加列表中的对象,直接赋值即可
Lst$income <- NULL #要删除列表中的对象,可将其赋为NULL,注意区别于NA
c(Lst,list(income=c(1980, 1600))) #多个列表连接得到新列表,注意未改变Lst本身的值
#查看列表的基本信息
names(Lst) #查看对象(元素)名
str(Lst) #查看对象(元素)属性:名字、数据类型和取值
#列表的快捷访问、R的变量搜索路径表
name #这样能否直接访问Lst中的name元素?
attach(Lst) #直接访问列表元素,需绑定(将Lst插入R的变量搜索路径表位置2)
search() #R的变量搜索路径表(自定义外部变量在前,软件包变量在后),加载包或绑定对象会改变次序
name; wife
detach(Lst) #解除绑定,若用detach()则默认删除搜索路径表的位置2
注意:
数据框结合了矩阵与列表的特点,在数据处理中应用广泛
数据框最接近实际数据,行代表观测(记录),列代表变量(指标)。
rownames(), colnames()
修改行/列名
# 1) 定义
# data.frame(*=*, *=*, …) 注意格式、常分行书写
df <- data.frame(
Name = c("Alice", "Becka", "James", "Jeffrey", "John"),
Sex = c("F", "F", "M", "M", "M"),
Age = c(13, 13, 12, 13, 12),
Height = c(56.5, 65.3, 57.3, 62.5, 59.0),
Weight = c(84.0, 98.0, 83.0, 84.0, 99.5)
); df
class(df) #该对象为data.frame类
is.data.frame(df) #判断是否为data.frame类,结果为真
# as.data.frame() 矩阵、列表(子对象等长)均可转成数据框
x <- matrix(1:8, nrow=2); x
as.data.frame(x)
#
# 2) 查看数据框
# names(), str() 查看基本信息,同list
names(df); str(df)
#注意:非数值型变量被强制转换为因子,因子将在下面介绍
# dim(), nrow(), ncol() 取维度、行数、列数
dim(df); nrow(df); ncol(df)
# View() 以表格形式查看df的详情(相当于在右上方窗口中单击"df")
View(df)
# edit(), fix() 视窗修改,修改df中的数据
edit(df); fix(df)
#
# 3) 访问与修改
# X[行号, 列号] 用法同matrix,“-”表示剔除
df[1,3]; df[1:2,3]; df[1:2,-3]
# X[列号] 同X[ , 列号]
df[1]; df[-2]
df[c(1,3)] #一次索引两列
df[1,] #第一行
# $, attach(), detach() 用法同list
df$Sex; df$Height
attach(df); Sex; detach(df)
# X[列的逻辑表达式, ] 用于筛选行(记录)
df[df$Sex=="M", ]
df[df$Sex=="M" & df$Age<13, ]
df[df$Sex=="M", ]$Age
df$Age[df$Sex=="M"] #同上
# <-, NULL 新增/修改/删除列,行修改不常用
df$Class <- c(1:3,2,3); df
df$Class <- NULL; df
df[1,3] <- 13
df[6,] <- c("Mary", "F", 12, 60, 90); df #行修改不常用
df <- df[-6,]; df
# rownames(), colnames() 用法同matrix,列名修改要谨慎
colnames(df)
rownames(df) <- LETTERS[1:nrow(df)]; df
df["A",]
#
# 4) 合并数据框
# cbind()/rbind() 合并列/行
rbind(df, df) #放下边
cbind(df, df) #放右边
# merge(x, y, by=*, all=T/F,…) 依某列合并行(记录)
df1 <- data.frame(
Name = c("Becka", "James", "Jeffrey", "John"),
Class = c(1:3,2)
); df1
merge(df, df1, by="Name", all=T) #有缺失的记录是否显示
merge(df, df1, by="Name", all=F)
#
# 5) 联动排序:order() 默认升序
df[order(df$Height), ]
df[order(df$Age, df$Height, decreasing=c(F,T)),] #先按年龄升序排,年龄相等的按降序排列
df$Name[order(df$Height)]
#
# 6) 数值计算(常基于列)
# colSums(), colMeans() 求列和、列均值
# apply(X, MARGIN, FUN, ...) 用法同matrix
colMeans(df[,4:5])
apply(df[4:5], 2, mean) #向量
df
# sapply(X, FUN, ...), lapply(X, FUN, ...) 对列施加运算,返回格式不同
sapply(df[4:5], mean) #向量
sapply(df[4:5], rank)
lapply(df[4:5], mean) #列表
#
# 7) 其他常用命令
# head(), tail() 默认只看前6、后6行
head(df); tail(df)
head(df,3) #查看前3行
# unique() 只看不同分量,也可以说是删除重复值
#unique返回向量,数据框或数组(如x),但删除了重复的元素/行。
unique(rep(1:3, c(3,4,5)))
unique(df$Age)
factor. 以下包含有函数gl(),cut(),sample(), tapply,table
变量可归结为名义型、有序型或连续型变量。
名义型变量是没有顺序之分的类别变量。
有序型变量表示一种顺序关系,而非数量关系。
连续型变量可以呈现为某个范围内的任意值,并同时表示了顺序和数量。
类别(名义型)变量和有序类别(有序型)变量在R中称为因子(factor).
#构造字符型因子
sexs <- c("F","F","M","M","M"); sexs
sexsF <- factor(sexs); sexsF #将字符串向量转化为因子,同as.factor()
class(sexsF) #SexF是因子,也可用is.factor(sexsF)来判断
levels(sexsF) #查看因子水平,因子水平是字符串向量
#表示名义变量
status <- c("Poor", "Improved", "Excellent", "Poor")
status <- factor(status)
status #Levels: Excellent Improved Poor
#要表示有序型变量,需要为函数factor()指定参数ordered=TRUE.
status <- factor(status,ordered = T)
status #Levels: Excellent < Improved < Poor
#按默认的字母顺序排序的因子很少能够让人满意。你可以通过指定levels选项来覆盖默认排序
status <- factor(status, order=TRUE,
levels=c("Poor", "Improved", "Excellent"))
status #Levels: Poor < Improved < Excellent
#数值型变量可以用levels和labels参数来编码成因子。
nums <- sample(1:2,8,replace=T); nums #抽样:从1~2中有放回地随机抽样8次
factor(nums) #将数值向量转化为因子,因子水平是:"1","2"
numsF <- factor(nums,levels=1:2,labels=c("F","M")); numsF #水平1,2更名为"F","M"
#sample(x, size, replace = FALSE, prob = NULL) 向量 抽几次 是否放回 概率
#gl()生成有规律的因子:gl(n, k, length = n*k, labels = 1:n, ordered = FALSE)
#通过指定其水平模式来生成因子。k是重复次数
gl(3,5) #结果:1 1 1 1 1 2 2 2 2 2 3 3 3 3 3,Levels: 1 2 3
gl(3,1,15) #结果:1 2 3 1 2 3 1 2 3 1 2 3 1 2 3,Levels: 1 2 3
gl(3,2,15) #1 1 2 2 3 3 1 1 2 2 3 3 1 1 2
gl(3,3,15) #1 1 1 2 2 2 3 3 3 1 1 1 2 2 2
gl(2, 1,10,labels = c("Control", "Treat"))
gl(2, 2,10,labels = c("Control", "Treat"))
gl(2, 3,10,labels = c("Control", "Treat"))
例1: 演示了普通因子和有序因子的不同是如何影响数据分析的
patientID <- c(1, 2, 3, 4)
age <- c(25, 34, 28, 52)
diabetes <- c("Type1", "Type2", "Type1", "Type1")
status <- c("Poor", "Improved", "Excellent", "Poor")
diabetes <- factor(diabetes)
status <- factor(status, order=TRUE)
patientdata <- data.frame(patientID, age, diabetes, status)
str(patientdata)
summary(patientdata) #显示连续型变量的最小值、最大值、均值和各四分位数;以及因子的频数统计
例2:因子的应用——成绩分析的例子
scores<-scan() #交互式输入成绩向量,注意需在输入完毕后在console窗口按回车键
25 45 50 54 55 61 64 68 72 75 75
78 79 81 83 84 84 84 85 86 86 86
87 89 89 89 90 91 91 92 100
cut(scores,breaks=c(0,59,70,85,100)) #将数值转换为因,利用cut函数截断连续取值的数据, 构造成绩水平因子
scoresF <- cut(scores,breaks=c(0,59,70,85,100),labels=c("差","中","良","优")); scoresF #更改标签
table(scoresF) #频数统计:统计各水平(成绩区间)下数据个数,返回值class属性为table
sexs <- sample(c("F","M"),length(scores),replace=T); sexs #随机抽样,构造性别向量
table(sexs) #频数统计:统计不同性别数据个数,sexs被强制转换成因子(因子的本质:分类变量)
table(sexs,scoresF) #按性别、成绩水平作交叉频数统计
tapply(scores,sexs,mean) #按因子不同水平计算成绩均值,sexs被强制转换成因子
补充::查看、修改和清除工作空间中的变量与数据集(右上方窗口Values/Data列表中)
ls() #列出全部变量与数据集 List Objects
rm(df) #清除df
rm(list=ls(all=TRUE)) #清除所有变量,等同于右上方窗口的扫把功能
#利用RStudio的扫把很容易删除R内存的对象、变量、图形等
#按“Ctrl+L”是清屏(得到一个干净的屏幕)
实验1 R的基本知识-1
# 实验1 R的基本知识-1
# 1.输出无理数e的(近似)值;
exp(1)
# 2.求 1+2+…+100 的和;
sum(1:100)
# 3.求 1+1/2+…+1/15 的(近似)值;
sum(1/(1:15))
# 4.生成规则序列s1:1,1,1,2,2,2,…,6,6,6;
s1 = rep(1:6,each=3);s1
# 5.生成规则序列s2,使1,2,3,4各重复5,2,1,3次;
s2=rep(1:4,c(5,2,1,3));s2
# 将七名学生的成绩98,100,86,90,83,92,55赋值给向量Score,并完成9-14题:
Score=c(98,100,86,90,83,92,55);Score
# 6.选出Score中>=90的分量,求其均值;
mean(Score[Score>=90])
#mean(Score [which(Score>=90)]) which---选出逻辑值为True的.
# 7.将Score中<60的分量改写为60;
#S = Score;S[S<60]=60;S 不需要建立副本
Score[Score<60]=60;Score
# 8.显示Score中最低的三个成绩(按升序排列);
#S_sort = sort(Score);S_sort[1:3]
sort(Score)[1:3]
# 9.输出Score的排名次序(成绩最高者排第1),保存至Rank;
Rank = rank(-Score) #rank---默认小的排第一
# 10.生成规则序列:st1708,…,st1714,保存至No;
num = 1708:1714;num
NO = paste("st",as.character(num),sep="");NO
# 11.将No,Score和Rank按列绑定并显示(提示:查询rbind及cbind命令的用法);
cbind(NO,Score,Rank)