安装xlsx包

#装之前先装jdk,配置环境变量
install.packages("xlsx")

R语言-记号体系-LMLPHP

R语言-记号体系-LMLPHP

代表安装成功

必须先加载包然后再使用包
library()

$提取符号

当一个函数里需要返回多个值(比如有变量,有向量,有矩阵)时,我们要用list,而不是return,
这时如果想提取某个变量的结果,就需要用到$,默认情况下,对于 `list`, `environment` 这两种对象,`$`可以提取(extract)出里面的元素。

必知必会的函数

x<-c(7,5,8,9,2)
#最大值
max(x)
#最小值
min(x)
#同时获取最大值和最小值
range(x)
#后一项减去前一项
diff(x)
#极差
diff(range(x))
#累加和
cumsum(x)
#累计乘积
cumprod(x)
#累计求最大值
cummax(x)
#累计求最小值
cummin(x) #基于矩阵和数据框的函数
#循环:显式循环、隐式循环
#显式:for、while、repeat
#隐式:apply、lapply、sapply #apply
#构造矩阵m
m<-matrix(1:12,nrow = 3,byrow = T)
#计算矩阵的每一行的和
# 1代表行,2代表列
apply(m,1,sum)
#计算矩阵的每一列的均值
apply(m,2,mean) #lapply
#构造一个列表
# l是逻辑向量
x<-list(a=1:10,beta=exp(-3:3),l=c(T,F,F,T))
#把mean函数作用到x的每一个元素上
lapply(x,mean) #sapply
#s代表简化,简化的是返回数据的数据结构
sapply(x,mean)
sapply(3:6,seq)
sapply(sapply(3:6,seq),sum)

写入excel文件

#plyr、openxlsx、xlsx
install.packages("rJava")
install.packages("xlsxjars") install.packages("plyr")
install.packages("openxlsx")
#装之前先装jdk,配置环境变量
install.packages("xlsx") library(xlsx)
library(openxlsx)
library(plyr) pkp<-data.frame(pm=rep(c("A",2:10,"J","Q","K"),times=4),
hs=rep(c("红桃","黑桃","梅花","方块"),each=13),
ds=rep(1:13,times=4),
stringsAsFactors = F)
#按照花色切分数据框
pkp_lst<-split(pkp,pkp$hs) #构造写入函数
xr<-function(x){
x_n<-unique(x$hs)
xlsx::write.xlsx(x,file = "扑克牌分类数据.xlsx",
sheetName=x_n,
row.names=F,
append=T)
}
l_ply(pkp_lst,xr)

openxlsx写入Excel

l#分三步:创建工作簿--添加工作表--保存工作簿
#第一步:创建工作簿

#openxlsx写入Excel
#分三步:创建工作簿--添加工作表--保存工作簿
#第一步:创建工作簿
wb<-openxlsx::createWorkbook()
#第二步:创建一个新的写入函数
xr<-function(x){
x_n<-unique(x$hs)
openxlsx::addWorksheet(wb,sheetName = x_n)
openxlsx::writeData(wb,x_n,x)
} l_ply(pkp_lst,xr) #第三步:保存工作簿
openxlsx::saveWorkbook(wb,"openxlsx-pkp.xlsx")

R的记号体系

值的选取:对于数据框,提取其中数据的语法为data.frame[i,j]
括号内有两个索引参数,逗号分隔,索引参数用来告诉R用来提取哪些值:第一个索引选择相应的行,第二个索引选择相应的列。
六种索引编写方式: #索引开始于1
正整数:返回第i行第j列的元素,要提取多个值,使用正整数向量代替单一整数作为索引;
负整数:将返回不包含负整数索引所对应的元素;

零:返回一个空对象;
空格:提取空格所在索引位置代表维度的所有元素;
逻辑值:匹配索引值为TRUE的位置并提取出相应元素,而忽略所有索引值为FALSE的位置
名称:被索引对象有名称属性时,常见于从数据框中提取列。
练习:用pkp数据练习数据值的选取。
#R的记号体系
#i代表行索引,j代表列索引
data.frame[i,j]
#正整数索引
#取第四行第二列的数据
pkp<-data.frame(pm=rep(c("A",2:10,"J","Q","K"),times=4),
hs=rep(c("红桃","黑桃","梅花","方块"),each=13),
ds=rep(1:13,times=4),
stringsAsFactors = F)
#
pkp[4,2]
#取第四行到第六行,第三列的数据
pkp[4:6,3]
pkp[4:6,3,drop=F] #取第四行和第六行,第三列的数据
pkp[c(4,6),3]
#取第四行到第六行,第二列到第三列的数据
pkp[4:6,2:3] #负整数索引
#不要第四行到第六行的数据,
#要第二列到第三列的数据
pkp[-(4:6),2:3] #零索引
pkp[0,0] #空格索引
#取第二行到第三行,所有列的数据
pkp[2:3, ]
pkp[2:3,]
pkp[2:3,1:3] #逻辑值索引
x<-c(7,9,2,5,8)
#取x>3的值
x[x>3]
#取x^2>4x的值
x^2
4*x
x^2>4*x
x[x^2>4*x]
#取牌面信息为K的牌
pkp[pkp[,1]=="K",]
> #取牌面信息为K的牌
> pkp[,1]=="K"
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[9] FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE
[17] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[25] FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE
[33] FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE
[41] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[49] FALSE FALSE FALSE TRUE
> pkp[pkp[,1]=="K",]
pm hs ds
13 K 红桃 13
26 K 黑桃 13
39 K 梅花 13
52 K 方块 13
#名称索引
names(pkp)
pkp[,"hs"]
pkp[,c("hs","ds")]
> names(pkp)
[1] "pm" "hs" "ds"
> pkp[,"hs"]
[1] "红桃" "红桃" "红桃" "红桃" "红桃" "红桃" "红桃"
[8] "红桃" "红桃" "红桃" "红桃" "红桃" "红桃" "黑桃"
[15] "黑桃" "黑桃" "黑桃" "黑桃" "黑桃" "黑桃" "黑桃"
[22] "黑桃" "黑桃" "黑桃" "黑桃" "黑桃" "梅花" "梅花"
[29] "梅花" "梅花" "梅花" "梅花" "梅花" "梅花" "梅花"
[36] "梅花" "梅花" "梅花" "梅花" "方块" "方块" "方块"
[43] "方块" "方块" "方块" "方块" "方块" "方块" "方块"
[50] "方块" "方块" "方块"
> pkp[,c("hs","ds")]
hs ds
1 红桃 1
2 红桃 2
3 红桃 3
m[3,2]
m[5]
pkp[1]
x[c(3,5)]
> x[c(3,5)]
[1] 2 8
> # 3行2列
> m[3,2]
[1] 10
> # 只有一个数字时,按照一纬的结构走1、5、9、2、6、10、
> m[5]
[1] 6
> # 数据框本质是列表,取列表第一个元素
> pkp[1]
pm
1 A
#在同一个维度上,不能同时使用
#正整数索引和负整数索引
x[c(-3,5)]
pkp[3:4,-1]
> #在同一个维度上,不能同时使用正整数索引和负整数索引
> x[c(-3,5)]
Error in x[c(-3, 5)] : only 0's may be mixed with negative subscripts
> #数据框二维结构可以使用正整数索引和负整数索引
> pkp[3:4,-1]
hs ds
3 红桃 3
4 红桃 4

$和[[]]----提取内容

在R里面,有两种对象可以使用$和[[]]数据框和列表。
使用方法:
$示例:pkp$value。
$解读:当使用$时,R会原封不动地提取元素,因此得到的对象不再是一个列表对象。
[[]]示例:pkp[[1]]
[[]]解读:如果使用双中括号,R则返回元素值,而不是它的列表结构。
#
pkp_lst$黑桃
列表
x<-list(1:10,exp(-3:3),c(T,F,F,T))
x[[1]]
#[]具有结构不变性
x[1]
pkp$hs
> #$和[[]]
> pkp_lst$黑桃
pm hs ds
14 A 黑桃 1
15 2 黑桃 2
16 3 黑桃 3 > x<-list(1:10,exp(-3:3),c(T,F,F,T))
> x[[1]]
[1] 1 2 3 4 5 6 7 8 9 10
> #[]具有结构不变性
> x[1]
[[1]]
[1] 1 2 3 4 5 6 7 8 9 10 > pkp$hs
[1] "红桃" "红桃" "红桃" "红桃" "红桃" "红桃" "红桃"
#命名向量
xx<-c(7,8,9)
names(xx)<-c("a","b","c")
xx<-c(a=7,b=8,c=9)
letters
names(xx)<-letters[1:3] xx["a"]
#去除命名向量的名称属性
unname(xx["a"])
xx[["a"]]
xx[[1]]
> xx["a"]
a
7
> #去除命名向量的名称属性
> unname(xx["a"])
[1] 7
> xx[["a"]]
[1] 7
> xx[[1]]
[1]

R的记号体系总结:

#R的记号体系总结:
#()函数的触发器
#{}是由若干条程序组成的代码块
#[],[[]],$执行的是索引的操作

就地修改

就地改值:首先明确描述想要修改的数值,然后用赋值符<-更改这些值。这样R会在原始对象内部对这些值进行修改。
两个注意点:
创建一个原先对象中并不存在的新值,R会自动将对象的长度延伸以适应这个新值。它的这个用途在于提供了一种为数据集添加新变量的绝佳方法。
如果将NULL赋给从数据框中提取的变量,则相当于将该变量从数据框中删除。
> #生成一个长度为6,元素都为0的向量
> x<-numeric(6)
> x[3]<-5
> x[4:5]<-c(1,2)
> x
[1] 0 0 5 1 2 0
> x[]<-100
> x
[1] 100 100 100 100 100 100
> x[]<-c(2,3)
> x
[1] 2 3 2 3 2 3
> x<-x+100
> x
[1] 102 103 102 103 102 103
> x[1:length(x)]
[1] 102 103 102 103 102 103
> x[7]
[1] NA
> x[8]<-90
> x
[1] 102 103 102 103 102 103 NA 90
> #pkp新增一列
> pkp$index<-1:52
> pkp
pm hs ds index
1 A 红桃 1 1
2 2 红桃 2 2
3 3 红桃 3 3

R语言-记号体系-LMLPHP

逻辑表达式

逻辑取子集:R会返回索引值向量中TRUE的位置所对应的值。
目标:通过逻辑测试的方法自动生成这些TRUE和FALSE。
逻辑测试:R的七种逻辑运算符

R语言-记号体系-LMLPHP

> 7!=8
[1] TRUE
> 7!=c(1:8)
[1] TRUE TRUE TRUE TRUE TRUE TRUE FALSE TRUE
> c("小明","小花","小亮")%in%c("小刚","小明")
[1] TRUE FALSE FALSE
> x<-c("小明","小花","小亮")
> y<-c("小刚","小明")
> #找x里边有,但是y里边没有的
> x[!x%in%y]
[1] "小花" "小亮"
> #找x里边有,y里边也有的
> x[x%in%y]
[1] "小明"
> #找y里边有的,但是x里边没有的
> y[!y%in%x]
[1] "小刚"
> #将pm信息为3的,ds修改为100
> pkp$pm==""
[1] FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE
[9] FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE
[17] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[25] FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE
[33] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[41] FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE
[49] FALSE FALSE FALSE FALSE
> pkp$ds[pkp$pm==""]<-100
> pkp
pm hs ds
1 A 红桃 1
2 2 红桃 2
3 3 红桃 100
4 4 红桃 4
布尔运算符:布尔运算符是类似于与和或这样的运算符。
R的六种布尔运算符

R语言-记号体系-LMLPHP

#布尔运算
#&并且

> (1>2)&(4>3)
[1] FALSE
> #|或者
> (1>2)|(4>3)
[1] TRUE
> #xor异或 是否只有一个为真
> xor(1>2,3>4)
[1] FALSE
> xor(1>2,3<4)
[1] TRUE
> #!非运算 是否为假
> !(2>1)
[1] FALSE
> !FALSE
[1] TRUE
> #any,所有的条件中是否至少有一个为真
> any(c(T,F,F,F,F))
[1] TRUE
> #all,所有的条件是否同时为真
> all(c(T,T,T,T,F))
[1] FALSE
>
> #将pm信息为黑桃3的点数修改为500
两个条件:pm==3,hs==黑桃
> pkp$ds[pkp$pm=="" & pkp$hs=="黑桃"]<-500
> pkp pkp$pm=="3" & pkp$hs=="黑桃"
R语言-记号体系-LMLPHP

练习题

R语言-记号体系-LMLPHP

pkp<-data.frame(pm=rep(c("A",2:10,"J","Q","K"),times=4),
hs=rep(c("红桃","黑桃","梅花","方块"),each=13),
ds=rep(1:13,times=4),
stringsAsFactors = F)
#pkp$pm=="A" # 第一题:取出扑克牌中四个A(4行3列)
pkp[pkp$pm=="A",] R语言-记号体系-LMLPHP
# 第二题:
pkp$pm=="A"
R语言-记号体系-LMLPHP
sum(pkp$pm=="A")
R语言-记号体系-LMLPHP
# 第三题:
pkp$hs=="红桃" pkp[pkp$hs=="红桃",]
R语言-记号体系-LMLPHP
# 思考题:
pkp$pm=="Q"&pkp$hs=="黑桃"
pkp[pkp$pm=="Q"&pkp$hs=="黑桃",]
R语言-记号体系-LMLPHP

练习:把黑桃和方块里边的J和Q的点数修改为10

p_1<-pkp$hs %in% c("黑桃","方块")
p_2<-pkp$pm %in% c("J","Q")
pkp$ds[p_1&p_2]<-10

缺失值

缺失值的发生:丢失、破坏或者测量并没有发生。
NA:R中用NA代表不可用(not available)。
默认机制:通常,在R运算或者R函数中,NA会原封不动地保留和传送。
设置参数na.rm=T:将NA移除,然后进行计算。
is.na:通过逻辑测试定位缺失值的位置。
> #缺失值
> is.na(c(3,5,NA))
[1] FALSE FALSE TRUE
> x<-c(3,5,NA)
> x[!is.na(x)]
[1] 3 5
> x[is.na(x)]
[1] NA
> is.na(x)
x<-c(3,5,NA)
> x==NA
[1] NA NA NA
> #识别一个向量里边缺失值的个数
> sum(is.na(x))
[1] 1
> #移除缺失值
> sum(x,na.rm = T)
[1] 8
> #查看数据的统计摘要
> summary(x)
Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
3.0 3.5 4.0 4.0 4.5 5.0 1
>
04-30 05:50