R基础



一、文件操作

1、工作路径

getwd() 列出当前工作路径;

setwd(dir) 设置工作路径,参数dir是要设置的路径。

2、list.files函数列出目录下文件

函数list.files和dir用法完全一样,可以列出路径下所有文件(包括目录);函数list.dirs只列出路径下所有目录。

> getwd()  #当前工作目录
[1] "C:/Users/YU/Documents"
> getwd()  #当前工作目录
[1] "C:/Users/YU/Documents"

#ls()列出内存变量-----------------------
b=3
ls()
[1] "b"
#-------------------------------------

> #判断文件夹是否存在,不存在则创建一个
> if(!file.exists("B:/Temp1/A")){
+   dir.create("B:/Temp1/A")
+ }
> #文件夹列表,目录
> list.dirs("B:/Temp1")
[1] "B:/Temp1"       "B:/Temp1/A"     "B:/Temp1/笔记"  "B:/Temp1/权游1"
> #文件列表,文件名字
> list.files("B:/Temp1")
 [1] "A"                             "df_hb小学.txt"                
 [3] "笔记"                          "高考.csv"                     
 [5] "高考.xlsx"                     "河北高考人数csv输出.csv"      
 [7] "河北高考人数csv输出减年.csv"   "权利的游戏第二季02 - 副本.mp4"
 [9] "权利的游戏第二季03 - 副本.mp4" "权利的游戏第二季04 - 副本.mp4"
[11] "权利的游戏第一季01.mp4"        "权利的游戏第一季02.mp4"       
[13] "权利的游戏第一季03.mp4"        "权利的游戏第一季04.mp4"       
[15] "权游1" 

list.files()函数参数解释

list.files(path = “.”, pattern = NULL, all.files = FALSE,full.names = FALSE, recursive = FALSE,ignore.case = FALSE, include.dirs = FALSE, no.. = FALSE)

  1. path:输入文件夹路径

  2. pattern:匹配文件名,选择自己所需的文件(可选项,默认是全部文件名,包括子文件夹,但是不包括子文件夹的文件),如pattern = “*.XPT”,表示要输出以.XPT结尾的文件名,如果没有符号,则输出包含.XPT的文件名

  3. all.files:是否返回所有文件,包括隐藏文件,但不包括子文件夹的文件,默认是否

  4. full.names:是否返回路径+文件名,默认是否,如果是否,则返回文件名

  5. recursive:是否将子文件夹的文件也列出来

  6. ignore.case:匹配的文件名是否忽略大小写,默认否,即不忽略大小写

示例

> (R.home())
[1] "B:/installs/RStudio/path/R-3.6.2"
> list.files(R.home())
 [1] "bin" "CHANGES" "COPYING" "doc" "etc"
 [6] "include" "library" "MD5" "modules" "README"
 [11] "README.R-3.6.2" "share" "src" "Tcl" "tests"
 [16] "unins000.dat" "unins000.exe"
 > list.files(R.home(),pattern = ".dat$")
[1] "unins000.dat"
> list.files(R.home(),pattern = ".dat$",full.names = T)
[1] "B:/installs/RStudio/path/R-3.6.2/unins000.dat"
> list.files(R.home(),pattern = "doc",full.names = T)
[1] "B:/installs/RStudio/path/R-3.6.2/doc"
#pattern:匹配文件名,选择自己所需的文件(可选项,默认是全部文件名,包括子文件夹,但是不包括子文件夹的文件),如pattern = "*.XPT$",表示要输出以.XPT结尾的文件名,如果没有$符号,则输出包含.XPT的文件名

3、删除文件

file.remove函数

> #删除文件
 > if(!file.exists("B:/Temp1/冰与火之歌第一季01.mp4")){ #先判断是否有这个文件,没有则创建一个
 + file.create("B:/Temp1/冰与火之歌第一季01.mp4")
 + }
 [1] TRUE
 > file.remove("B:/Temp1/冰与火之歌第一季01.mp4")
 [1] TRUE
 #---------------------------------------------------
> list.files("B:/Temp1/A",pattern = "02")
[1] "权力的游戏第一季02.mp4"
> 
> list.files("B:/Temp1/A",pattern = "02",full.names = T)
[1] "B:/Temp1/A/权力的游戏第一季02.mp4"
> file.remove(list.files("B:/Temp1/A/",pattern = "02",full.names = F)) #必须是全部路径,full.names改为T

[1] FALSE
Warning message:
In file.remove(list.files("B:/Temp1/A/", pattern = "02", full.names = F)) :
  无法删除文件'权力的游戏第一季02.mp4',原因是'No such file or directory'
> file.remove(list.files("B:/Temp1/A/",pattern = "02",full.names = T)) #不能只是文件名
[1] TRUE
> list.files("B:/Temp1/A/")  #查看删除结果
[1] "权力的游戏第一季01.mp4" "权力的游戏第一季03.mp4" "权力的游戏第一季04.mp4"

注意

file.remove只能移除文件,不能移除文件夹

> list.dirs("B:/Temp2")
[1] "B:/Temp2"           "B:/Temp2/.text"     "B:/Temp2/text"     
[4] "B:/Temp2/text.text" "B:/Temp2/text.txt" 
> file.remove("B:/Temp2/text")  #text是文件夹

[1] FALSE
Warning message:
In file.remove("B:/Temp2/text") :
  无法删除文件'B:/Temp2/text',原因是'Permission denied'

4、复制文件

file.copy()

file.copy(from, to, overwrite = recursive, recursive = FALSE,
copy.mode = TRUE, copy.date = FALSE)
from是原始文件(目录)名,to是新文件(目录)名,二者可以是vector,但是长度需相同;

overwrite 若为TRUE,则文件被覆盖;

recursive 复制目录时recursive需为TRUE;

copy.mode若为TRUE,permission bits一并复制过来;

copy.date若为TRUE,文件日期一并复制过来。

> file0<-list.files("B:/Temp1",pattern = "权利的游戏第一季",full.names=T)
> file0
[1] "B:/Temp1/权利的游戏第一季01.mp4" "B:/Temp1/权利的游戏第一季02.mp4"
[3] "B:/Temp1/权利的游戏第一季03.mp4" "B:/Temp1/权利的游戏第一季04.mp4"
> #复制文件----------------------------------------
> file.copy(file0,"B:/Temp1/A",copy.date = F)  #注意此时file0是路径+文件名

[1] TRUE TRUE TRUE TRUE
> #查看复制结果
> list.files("B:/Temp1/A/")
[1] "权力的游戏第一季01.mp4" "权力的游戏第一季03.mp4" "权力的游戏第一季04.mp4"
[4] "权利的游戏第一季01.mp4" "权利的游戏第一季02.mp4" "权利的游戏第一季03.mp4"
[7] "权利的游戏第一季04.mp4"

5、重命名

file.rename

> #重命名-------------------------------------------------
> #获取A文件夹下的文件路径及文件名
> fileA<-list.files("B:/Temp1/A",full.names = T)
> fileA
[1] "B:/Temp1/A/权力的游戏第一季01.mp4" "B:/Temp1/A/权力的游戏第一季03.mp4"
[3] "B:/Temp1/A/权力的游戏第一季04.mp4" "B:/Temp1/A/权利的游戏第一季01.mp4"
[5] "B:/Temp1/A/权利的游戏第一季02.mp4" "B:/Temp1/A/权利的游戏第一季03.mp4"
[7] "B:/Temp1/A/权利的游戏第一季04.mp4"
> fileA_rename=sub("利","力",fileA)  #进行字符的替换,宋老师的输入法可能有毒,或者他语文不好。

> fileA_rename
[1] "B:/Temp1/A/权力的游戏第一季01.mp4" "B:/Temp1/A/权力的游戏第一季03.mp4"
[3] "B:/Temp1/A/权力的游戏第一季04.mp4" "B:/Temp1/A/权力的游戏第一季01.mp4"
[5] "B:/Temp1/A/权力的游戏第一季02.mp4" "B:/Temp1/A/权力的游戏第一季03.mp4"
[7] "B:/Temp1/A/权力的游戏第一季04.mp4"
> file.rename(fileA,fileA_rename)   #重命名操作
[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE
> list.files("B:/Temp1/A")  #查看结果
[1] "权力的游戏第一季01.mp4" "权力的游戏第一季02.mp4" "权力的游戏第一季03.mp4"
[4] "权力的游戏第一季04.mp4"


#补充小函数------------------------------------------
#sub函数-----------------------
>c="lishiyu"
>c
[1] "lishiyu"
b<-sub("yu","kjsfkjsdhgkhj",c)
b
[1] "lishikjsfkjsdhgkhj"
c
[1] "lishiyu"

gsub()函数

一个有趣的随机姓名生成网站

谁把他变成付费的了:weary:

是我进的太多了吗……:sob::sob:

随机生成50个李姓家族人氏

于是乎,生成了

如下结果

李寝叹
李秋声
李损辞
李不庐
李幽忽
李此回
李日者
李彼其
李应寂
李花端
李香蒙
李园飞
李纵追
李慕兮
李郁而
李忆眠
李山托
李枝花
李其伤
李兮之
李易皮
李高低
李京和
李恢身
李还忽
李便狂
李椒盈
李债坡
李见兮
李傍岩
李林禽
李聊蟪
李在旁
李收欿
李驖在
李路兮
李行迈
李蕃长
李晦兮
李叶廊
李东帘
李看色
李师北
李沛罔
李吉兮
李帐不
李巨献
李降椒
李何至
李花故

得去掉换行和空格啊

> a="李寝叹
+ 李秋声
+ 李损辞
+ 李不庐
+ 李幽忽
+ 李此回
+ 李日者
+ 李彼其
+ 李应寂
+ 李花端
+ 李香蒙
+ 李园飞
+ 李纵追
+ 李慕兮
+ 李郁而
+ 李忆眠
+ 李山托
+ 李枝花
+ 李其伤
+ 李兮之
+ 李易皮
+ 李高低
+ 李京和
+ 李恢身
+ 李还忽
+ 李便狂
+ 李椒盈
+ 李债坡
+ 李见兮
+ 李傍岩
+ 李林禽
+ 李聊蟪
+ 李在旁
+ 李收欿
+ 李驖在
+ 李路兮
+ 李行迈
+ 李蕃长
+ 李晦兮
+ 李叶廊
+ 李东帘
+ 李看色
+ 李师北
+ 李沛罔
+ 李吉兮
+ 李帐不
+ 李巨献
+ 李降椒
+ 李何至
+ 李花故"
> a
[1] "李寝叹\n李秋声\n李损辞\n李不庐\n李幽忽\n李此回\n李日者\n李彼其\n李应寂\n李花端\n李香蒙\n李园飞\n李纵追\n李慕兮\n李郁而\n李忆眠\n李山托\n李枝花\n李其伤\n李兮之\n李易皮\n李高低\n李京和\n李恢身\n李还忽\n李便狂\n李椒盈\n李债坡\n李见兮\n李傍岩\n李林禽\n李聊蟪\n李在旁\n李收欿\n李驖在\n李路兮\n李行迈\n李蕃长\n李晦兮\n李叶廊\n李东帘\n李看色\n李师北\n李沛罔\n李吉兮\n李帐不\n李巨献\n李降椒\n李何至\n李花故"
> b=sub("\n","、",a)
> b
[1] "李寝叹、李秋声\n李损辞\n李不庐\n李幽忽\n李此回\n李日者\n李彼其\n李应寂\n李花端\n李香蒙\n李园飞\n李纵追\n李慕兮\n李郁而\n李忆眠\n李山托\n李枝花\n李其伤\n李兮之\n李易皮\n李高低\n李京和\n李恢身\n李还忽\n李便狂\n李椒盈\n李债坡\n李见兮\n李傍岩\n李林禽\n李聊蟪\n李在旁\n李收欿\n李驖在\n李路兮\n李行迈\n李蕃长\n李晦兮\n李叶廊\n李东帘\n李看色\n李师北\n李沛罔\n李吉兮\n李帐不\n李巨献\n李降椒\n李何至\n李花故"

不对啊,这只替换了第一个,仔细看,因为只有一个 [1]

gsub()函数

> c=gsub("\n","、",a)
> c
[1] "李寝叹、李秋声、李损辞、李不庐、李幽忽、李此回、李日者、李彼其、李应寂、李花端、李香蒙、李园飞、李纵追、李慕兮、李郁而、李忆眠、李山托、李枝花、李其伤、李兮之、李易皮、李高低、李京和、李恢身、李还忽、李便狂、李椒盈、李债坡、李见兮、李傍岩、李林禽、李聊蟪、李在旁、李收欿、李驖在、李路兮、李行迈、李蕃长、李晦兮、李叶廊、李东帘、李看色、李师北、李沛罔、李吉兮、李帐不、李巨献、李降椒、李何至、李花故"

OK~!

提取出第2到4个位置上的字

> #提取出第2到4个位置上的字
> substr("李世昱嘿嘿lishiyu",2,4)
[1] "世昱嘿"

其他字符串

获取字符串长度:nchar()

字符串分割:strsplit()

字符串拼接:paste()
字符串截取:substr()

字符串替代:gsub() chartr() sub()

字符串匹配:grep()

大小写替换:toupper() tolower()


6、保存脚本文件

保存编码为GB18030,否则中文会变成乱码

7、查看帮助文档

?加函数名

例如:?read.csv查看read.csv函数的帮助文档

rm(list=ls())
df<-read.csv("B:/hh.csv",header=T)

8、常用函数

1)strsplit拆分

> #拆分
> a<-'2020/2/24'
> b<-strsplit(a,"/")
> b
[[1]]
[1] "2020" "2"    "24"  

> a1<-b[[1]][1]
> a1
[1] "2020"
> a2<-b[[1]][2]
> a2
[1] "2"
> a3<-b[[1]][3]
> a3
[1] "24"

2)file_path_sans_ext文件去后缀

> #文件去后缀
> #需要导包,tools包
> library(tools)
> flie0=file_path_sans_ext("B:/Temp2/新建文本文档.txt")
> flie0
[1] "B:/Temp2/新建文本文档"
> #原文件不改变
> list.files("B:/Temp2/")
 [1] "2017016525-马晓雷.rar"                "data"                                
 [3] "dd"                                   "DXY-COVID-19-Data-master"            
 [5] "DXY-COVID-19-Data-master.zip"         "Novel-Coronavirus-Updates-master"    
 [7] "Novel-Coronavirus-Updates-master.zip" "text"                                
 [9] "text.text"                            "text.txt"                            
[11] "Zgkrs.R"                              "河北.csv"                            
[13] "历年中高考人数.tif"                   "全国疫情整理-李世昱.xlsx"            
[15] "新建文本文档.txt" 

3)as.integer类型转换

> #类型转换
> x='123'
> typeof(x)
[1] "character"
> y<-as.numeric(x)
> typeof(y)
[1] "double"
> y1<-as.integer(x)
> typeof(y1)
[1] "integer"

4)paste函数

#paste函数--------------------------------------
paste("a","b",sep = "=")##注意到用等号分隔了
# "a=b"

paste("a",1:5,sep = "")#会自动每个元素与a相连
#"a1" "a2" "a3" "a4" "a5"

paste("a",1:5,".pdf", sep = "")#比如想批量输出文件名
#"a1.pdf" "a2.pdf" "a3.pdf" "a4.pdf" "a5.pdf"

paste函数未完待续……

5)dir函数

代码解释
rm(list = ls())
setwd("B:/Temp2/")
#查看当前目录的子目录和文件--------------------------
#同list.files()
dir() 
#列出以2开头的文件或子目录---------------------------
dir(path="B:/Temp2/",pattern='^2') 
# 列出目录下所有的目录和文件,包括隐藏文件------------
#同list.files(".",all.files=TRUE)
dir(path="B:/Temp2/",all.files=TRUE) 
控制台运行结果

rm(list = ls())
setwd(“B:/Temp2/“)
#查看当前目录的子目录和文件———————–
#同list.files()
dir()
[1] “201401.tif” “a1” “data” “test” “数据.zip” “外文件夹_1”
[7] “外文件夹_10” “外文件夹_2” “外文件夹_3” “外文件夹_4” “外文件夹_5” “外文件夹_6”
[13] “外文件夹_7” “外文件夹_8” “外文件夹_9” “外文件夹1” “外文件夹10” “外文件夹2”
[19] “外文件夹3” “外文件夹4” “外文件夹5” “外文件夹6” “外文件夹7” “外文件夹8”
[25] “外文件夹9” “月数据格点数据集” “月数据格点数据集.zip”
#列出以2开头的文件或子目录—————————
dir(path=”B:/Temp2/“,pattern=’^2’)
[1] “201401.tif”

#列出目录下所有的目录和文件,包括隐藏文件——

#同list.files(“.”,all.files=TRUE)
dir(path=”B:/Temp2/“,all.files=TRUE)
[1] “.” “..” “201401.tif” “a1” “data” “test”
[7] “数据.zip” “外文件夹_1” “外文件夹_10” “外文件夹_2” “外文件夹_3” “外文件夹_4”
[13] “外文件夹_5” “外文件夹_6” “外文件夹_7” “外文件夹_8” “外文件夹_9” “外文件夹1”
[19] “外文件夹10” “外文件夹2” “外文件夹3” “外文件夹4” “外文件夹5” “外文件夹6”
[25] “外文件夹7” “外文件夹8” “外文件夹9” “月数据格点数据集” “月数据格点数据集.zip”


9、终极boss之——批量生成文件夹、文件树


#批量生成文件夹---------------------------------
rm(list = ls())
setwd("B:/Temp2/")
for (i in 1:10) {
   if (file.exists(paste('外文件夹',i,sep = '_'))) {
    print("文件已经存在啦~")
  }
  else{
    dir.create(paste('外文件夹',i,sep = ''))
   }
}

 #在每个文件夹下分别生成一个文件夹---------------
 for (i in 1:10) {
   a<-paste('外文件夹',i,sep = '','/内文件夹')
   print(a)
   dir.create(paste('外文件夹',i,sep = '','/内文件夹'))#相当于又加了个路径
}
#[1] "外文件夹1/内文件夹"
#[1] "外文件夹2/内文件夹"
#[1] "外文件夹3/内文件夹"
#[1] "外文件夹4/内文件夹"
#[1] "外文件夹5/内文件夹"
#[1] "外文件夹6/内文件夹"
#[1] "外文件夹7/内文件夹"
#[1] "外文件夹8/内文件夹"
#[1] "外文件夹9/内文件夹"
#[1] "外文件夹10/内文件夹"

#列出文件树------------------------------------
system("tree")

#卷 新加卷 的文件夹 PATH 列表
#卷序列号为 3001-56A6
#B:.
#├─data
#├─test
#├─外文件夹1
#│  └─内文件夹
#├─外文件夹10
#│  └─内文件夹
#├─外文件夹2
#│  └─内文件夹
#├─外文件夹3
#│  └─内文件夹
#├─外文件夹4
#│  └─内文件夹
#├─外文件夹5
#│  └─内文件夹
#├─外文件夹6
#│  └─内文件夹
#├─外文件夹7
#│  └─内文件夹
#├─外文件夹8
#│  └─内文件夹
#├─外文件夹9
#│  └─内文件夹
#└─月数据格点数据集
#   ├─气温
#    └─降水
#[1] 0

10、时间&计算运算效率

①proc.time()


#计算代码运行时间,设置t1为开始时间
t1<-proc.time()

……
……代码块
……

t2<-proc.time()
t=t2-t1
print(paste0("运行时间为 ",t[3][[1]],' 秒')) #不清楚t[3][[1]]什么含义

②date()、Sys.time()和difftime()

> #有关时间运算----
> #第一种
> date()
[1] "Mon Mar 16 22:21:13 2020"
> 
> m1=Sys.time()
> m1
[1] "2020-03-16 22:21:13 CST"
> m2=Sys.time()
> difftime(m1,m2,units = "auto") #时间差
Time difference of -0.1538639 secs
> 
> t2<-proc.time()
> t2
  用户   系统   流逝 
  3.59   0.76 203.90

11、source()

引用并运行其他位置的代码文件

source("B:/Temps/降水年总和批量输出.R",encoding='GB18030')

二、Plots图表

读取数据文件

> rm(list=ls())
> data=read.csv("B:/Temp1/高考.csv",header=T) #读取csv数据,还有read.table
> data   #查看数据
   地区 年份 中考人数 高考人数
1  河北 2000      330      400
2  河北 2001      332      405
3  河北 2002      334      410
4  河北 2003      336      415
5  河北 2004      338      420
6  河北 2005      340      425
7  河南 2000      360      430
8  河南 2001      365      435
9  河南 2002      370      440
10 河南 2003      375      445
11 河南 2004      380      450
12 河南 2005      385      455
> colnames(data)
[1] "地区"     "年份"     "中考人数" "高考人数"
> colnames(data)<-c('Region','Year','ZhongKao','GaoKao')   #修改列名
> colnames(data)
[1] "Region"   "Year"     "ZhongKao" "GaoKao" 

提取子集、去掉指定列

> data_HB<-subset(data,Region=='河北')   #提取Region为河北的子集
> data_HB
  Region Year ZhongKao GaoKao
1   河北 2000      330    400
2   河北 2001      332    405
3   河北 2002      334    410
4   河北 2003      336    415
5   河北 2004      338    420
6   河北 2005      340    425
> write.csv(data_HB,"B:/Temp1/A/子集河北.csv")   #还有write.table
# write.table(data_HB,"B:/Temp1/A/子集河北0.txt",append = T) #追加,下有详细说明
> dataNoYear<-subset(data,select = -Year)   #去掉Year列的子集,有减号
> dataNoYear   #查看结果
   Region ZhongKao GaoKao
1    河北      330    400
2    河北      332    405
3    河北      334    410
4    河北      336    415
5    河北      338    420
6    河北      340    425
7    河南      360    430
8    河南      365    435
9    河南      370    440
10   河南      375    445
11   河南      380    450
12   河南      385    455
>

write.table的append参数

 write.table(data_HB,"B:/Temp1/A/子集河北0.txt",append = T) #追加

输出结果

Plot

View(data_HB)   #查看data_HB
> plot(data_HB$Year,data_HB$ZhongKao)

结果:

> a<-2000:2018
> length(a)
[1] 19
> b<-c(runif(19,350,1500))
> plot(a,b, type = "o",pch=21,bg="pink",cex=1.3,lty=5,lwd=2,main ="2000-2018年历年高考报考人数",col.main="black", font.main=2,xlab ="年份/年", ylab = "人数/万", col.lab=rgb(0,0.5,0.5),font.lab=2,xlim = c(2000,2018),col="blue",bty="l")
> 
#a横坐标
#b纵坐标
#type节点类型
#……

各参数详解

type为类型。

bg为节点底色
cex为节点大小
lty=6为线条类型,实线,虚线……
lwd=2为线条粗细
main为表格标题
col.main=”black”为标题字体颜色为黑色
ylab = “人数/万”为纵坐标标题
col.lab=rgb(0,0.5,0.5)为纵坐标标题字体颜色
font.lab=2为纵坐标标题字体大小

xlim = c(2000,2018),col=”blue”,bty=”l”没细追究,嘻嘻

注意

不能这么赋值。

> a=2000:2018
Warning messages:
1: In doTryCatch(return(expr), name, parentenv, handler) :
  显示串列没有完全被刷新
2: In doTryCatch(return(expr), name, parentenv, handler) :
  invalid graphics state
3: In doTryCatch(return(expr), name, parentenv, handler) :
  invalid graphics state
4: In doTryCatch(return(expr), name, parentenv, handler) :
  显示串列没有完全被刷新
5: In doTryCatch(return(expr), name, parentenv, handler) :
  invalid graphics state
6: In doTryCatch(return(expr), name, parentenv, handler) :
  invalid graphics state
> a<-2000:2018
> length(a)
[1] 19

在RStudio的Plots中结果出图


输出Plot图 (有问题【悬而未决】)

不能在Plots和输出文件中同时输出

如下则只能输出文件,在Plots中不能显示

a<-2000:2018
length(a)
b<-c(runif(19,350,1500))
tiff(file="B:/Temp1/d.tif")
plot(a,b, type = "o",pch=21,bg="pink",cex=1.3,lty=5,lwd=2,main ="2000-2018年历年高考报考人数",col.main="black", font.main=2,xlab ="年份/年", ylab = "人数/万", col.lab=rgb(0,0.5,0.5),font.lab=2,xlim = c(2000,2018),col="blue",bty="l")
#tiff(file="B:/Temp1/d.tif")
dev.off()

以下则只能在Plots中输出,文件中为空白图像

a<-2000:2018
length(a)
b<-c(runif(19,350,1500))
plot(a,b, type = "o",pch=21,bg="pink",cex=1.3,lty=5,lwd=2,main ="2000-2018年历年高考报考人数",col.main="black", font.main=2,xlab ="年份/年", ylab = "人数/万", col.lab=rgb(0,0.5,0.5),font.lab=2,xlim = c(2000,2018),col="blue",bty="l")

tiff(file="B:/Temp1/d.tif")
dev.off()

在前面加了dev.new(),然鹅还是不行。

dev.new()
a<-2000:2018
length(a)
b<-c(runif(19,350,1500))
tiff(file="B:/Temp1/d.tif")
plot(a,b, type = "o",pch=21,bg="pink",cex=1.3,lty=5,lwd=2,main ="2000-2018年历年高考报考人数",col.main="black", font.main=2,xlab ="年份/年", ylab = "人数/万", col.lab=rgb(0,0.5,0.5),font.lab=2,xlim = c(2000,2018),col="blue",bty="l")
#tiff(file="B:/Temp1/d.tif")
dev.off()

seq函数七十二变

  • seq(from)

  • seq(from, to)

  • seq(from, to, by= )

  • seq(along.with= )

  • seq(length.out= )

  • seq(from, to, length.out= )

> seq(from=10,to=20)
 [1] 10 11 12 13 14 15 16 17 18 19 20

seq(from)

> seq(50)
 [1]  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] 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50

seq(from, to)

> seq(1,10)
 [1]  1  2  3  4  5  6  7  8  9 10
> seq(10,1)

 [1] 10  9  8  7  6  5  4  3  2  1

seq(from, to, by= )

> seq(1,10,2)
[1] 1 3 5 7 9

seq(along.with= )

along.with:表示生成的向量为现有一向量元素的索引

> x <- c(1.2, 5.2, 6.3, 4.6)
> a<-seq(along.with=x)
> a
[1] 1 2 3 4

seq(length.out= )

输出限定范围内的leng.out个数,

> seq(20)
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20

seq(from, to, length.out= )

> seq(1,10,length.out = 3)  #输出1-10三个数。取中间值
  [1]  1.0  5.5 10.0

已知错误

  1. 中文路径。

    尽量不要用中文路径,中文文件名称。在Plot中,输出路径为中文路径,导致输出图片为空白

  2. 使用Plot画布无法显示,出现Error。

    将画布拖大即可

> plot(data$Year,data$ZhongKao)
Error in plot.new() : figure margins too large

三、Dataframe

> #Dataframe-------------------------------
> #Dataframe
> ##创建Dataframe函数
> ls()
[1] "a"  "df" "i"  "l" 
> rm(list = ls())
> ls()
character(0)
> library(dplyr)      #载入程辑包:‘dplyr’
> options(digits = 0) #保留整数
> set.seed(1)    #设置种子函数
> df<-data.frame(ID=1:12,
+                Class=rep(c(1,2,3),4), #对数组123,重复4遍
+                Chinese=runif(12,min = 0,max = 100), #runif随机产生12个0-100的数
+                Math=runif(12,min = 0,max = 100),
+                English=runif(12,min = 0,max = 100)
+ )
> df  #查看Dataframe
   ID Class Chinese Math English
1   1     1      27   69      27
2   2     2      37   38      39
3   3     3      57   77       1
4   4     1      91   50      38
5   5     2      20   72      87
6   6     3      90   99      34
7   7     1      94   38      48
8   8     2      66   78      60
9   9     3      63   93      49
10 10     1       6   21      19
11 11     2      21   65      83
12 12     3      18   13      67
> for(i in 1:ncol(df)){
+   df[,i]<-as.integer(df[,i])  #将每列变为integer类型
+ }
> df
   ID Class Chinese Math English
1   1     1      26   68      26
2   2     2      37   38      38
3   3     3      57   76       1
4   4     1      90   49      38
5   5     2      20   71      86
6   6     3      89   99      34
7   7     1      94   38      48
8   8     2      66   77      59
9   9     3      62   93      49
10 10     1       6   21      18
11 11     2      20   65      82
12 12     3      17   12      66
> ncol(df)  #查询列数
[1] 5
> 
> l=2.3
> as.integer(l)  #转化为整型
[1] 2
> 
> for (i in 1:ncol(df)) {  #将每一行输出
+   print(df[,i])
+ }
 [1]  1  2  3  4  5  6  7  8  9 10 11 12
 [1] 1 2 3 1 2 3 1 2 3 1 2 3
 [1] 26 37 57 90 20 89 94 66 62  6 20 17
 [1] 68 38 76 49 71 99 38 77 93 21 65 12
 [1] 26 38  1 38 86 34 48 59 49 18 82 66
> 
> 
> ##花式查询
> df[2,]  #第二行
  ID Class Chinese Math English
2  2     2      37   38      38
> df[,4]  #第四列
 [1] 68 38 76 49 71 99 38 77 93 21 65 12
> df[3,'Math']
[1] 76
> df$Math[3]
[1] 76
> 
> df$Chinese  #Chinese这一列
 [1] 26 37 57 90 20 89 94 66 62  6 20 17
> df[3]  #第三列,(也是Chinese这一列),会有表头输出
   Chinese
1       26
2       37
3       57
4       90
5       20
6       89
7       94
8       66
9       62
10       6
11      20
12      17
> 
> typeof(df[,3])  #查看数值类型
[1] "integer"
> class(df)   #变量类型
[1] "data.frame"
> 
> nrow(df)   #行数
[1] 12
> ncol(df)   #列数
[1] 5
> a=1:5
> a
[1] 1 2 3 4 5
> length(a)  #长度
[1] 5
> for (i in 1:length(a)) {
+   print(i)
+ }
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
> 
> #which语句,查找符合条件的行
> df
   ID Class Chinese Math English
1   1     1      26   68      26
2   2     2      37   38      38
3   3     3      57   76       1
4   4     1      90   49      38
5   5     2      20   71      86
6   6     3      89   99      34
7   7     1      94   38      48
8   8     2      66   77      59
9   9     3      62   93      49
10 10     1       6   21      18
11 11     2      20   65      82
12 12     3      17   12      66
> df[which(df$ID==4),]
  ID Class Chinese Math English
4  4     1      90   49      38
> df[which(df$Chinese>=57),'ID']   #查询Chinese>=57的ID是多少
[1] 3 4 6 7 8 9

更改R包默认安装路径(未试)

#新建一个初始启动文件
file.edit(’~/.Rprofile’)

#更改R包默认安装路径
.libPaths(“D:/Program Files/R/win-library/3.5”)
myPaths <- c(“D:/Program Files/R/win-library/3.5”)
.libPaths(myPaths)

然后把代码复制到初始文件.Rprofile中。
重启R,即可。


四、批量生成文件夹

代码部分

#批量生成文件夹---------------------------------
rm(list = ls())
setwd("B:/Temp2/")
for (i in 1:10) {
  if (file.exists(paste('外文件夹',i,sep = '_'))) {
    print("文件已经存在啦~")
  }
  else{
    dir.create(paste('外文件夹',i,sep = '_'))
  }
}
dir()

运行结果

#批量生成文件夹———————————
rm(list = ls())
setwd(“B:/Temp2/“)
for (i in 1:10) {

  • if (file.exists(paste(‘外文件夹’,i,sep = ‘_’))) {
  • print(“文件已经存在啦~”)
  • }
  • else{
  • dir.create(paste(‘外文件夹’,i,sep = ‘_’))
  • }
  • }
    [1] “文件已经存在啦
    [1] “文件已经存在啦

    [1] “文件已经存在啦
    [1] “文件已经存在啦

    [1] “文件已经存在啦
    [1] “文件已经存在啦

    [1] “文件已经存在啦
    [1] “文件已经存在啦

    [1] “文件已经存在啦
    [1] “文件已经存在啦

dir()
[1] “201401.tif” “a1” “data” “test” “数据.zip” “外文件夹_1”
[7] “外文件夹_10” “外文件夹_2” “外文件夹_3” “外文件夹_4” “外文件夹_5” “外文件夹_6”
[13] “外文件夹_7” “外文件夹_8” “外文件夹_9” “外文件夹1” “外文件夹10” “外文件夹2”
[19] “外文件夹3” “外文件夹4” “外文件夹5” “外文件夹6” “外文件夹7” “外文件夹8”
[25] “外文件夹9” “月数据格点数据集” “月数据格点数据集.zip”

五、批量新建子目录

1、”笨”办法

#在每个文件夹下分别生成一个文件夹---------------
rm(list = ls())
setwd("B:/Temp2/")
for (i in 1:10) {
  a<-paste('外文件夹',i,sep = '','/内文件夹')
  print(a)
  if (file.exists(paste('外文件夹',i,sep = '','/内文件夹'))) {
    print("文件已经存在啦~")
  }
  else{
    dir.create(paste('外文件夹',i,sep = '','/内文件夹'))#相当于又加了个路径
  }
}
system("tree")

运行结果

#在每个文件夹下分别生成一个文件夹—————
rm(list = ls())
setwd(“B:/Temp2/“)
for (i in 1:10) {

  • a<-paste(‘外文件夹’,i,sep = ‘’,’/内文件夹’)
  • print(a)
  • if (file.exists(paste(‘外文件夹’,i,sep = ‘’,’/内文件夹’))) {
  • print(“文件已经存在啦~”)
  • }
  • else{
  • dir.create(paste(‘外文件夹’,i,sep = ‘’,’/内文件夹’))#相当于又加了个路径
  • }
  • }
    [1] “外文件夹1/内文件夹”
    [1] “文件已经存在啦
    [1] “外文件夹2/内文件夹”
    [1] “文件已经存在啦

    [1] “外文件夹3/内文件夹”
    [1] “文件已经存在啦
    [1] “外文件夹4/内文件夹”
    [1] “文件已经存在啦

    [1] “外文件夹5/内文件夹”
    [1] “文件已经存在啦
    [1] “外文件夹6/内文件夹”
    [1] “文件已经存在啦

    [1] “外文件夹7/内文件夹”
    [1] “文件已经存在啦
    [1] “外文件夹8/内文件夹”
    [1] “文件已经存在啦

    [1] “外文件夹9/内文件夹”
    [1] “文件已经存在啦
    [1] “外文件夹10/内文件夹”
    [1] “文件已经存在啦

    system(“tree”)
    卷 新加卷 的文件夹 PATH 列表
    卷序列号为 3001-56A6
    B:.
    ├─a1
    │ └─b2
    │ └─c3
    ├─data
    ├─test
    │ └─3组李世昱组
    │ ├─2017016427李世昱
    │ │ ├─R脚本
    │ │ └─tiff文件
    │ ├─2017016427李世昱1
    │ └─2017016427李世昱2
    ├─外文件夹1
    │ └─内文件夹
    ├─外文件夹10
    │ └─内文件夹
    ├─外文件夹2
    │ └─内文件夹
    ├─外文件夹3
    │ └─内文件夹
    ├─外文件夹4
    │ └─内文件夹
    ├─外文件夹5
    │ └─内文件夹
    ├─外文件夹6
    │ └─内文件夹
    ├─外文件夹7
    │ └─内文件夹
    ├─外文件夹8
    │ └─内文件夹
    ├─外文件夹9
    │ └─内文件夹
    ├─外文件夹_1
    ├─外文件夹_10
    ├─外文件夹_2
    ├─外文件夹_3
    ├─外文件夹_4
    ├─外文件夹_5
    ├─外文件夹_6
    ├─外文件夹_7
    ├─外文件夹_8
    ├─外文件夹_9
    └─月数据格点数据集
    ├─气温
    └─降水
    [1] 0


system(“tree”)真是个有趣的操作


2、:star: 巧方法

使用recursive参数

#创建一个3级子目录./a1/b2/c3
setwd("B:/Temp2/")
getwd()
list.dirs()
dir.create(path = "a1/b2/c3") #直接创建,出错
dir.create(path="a1/b2/c3",recursive = TRUE)
system("tree")
list.dirs()

控制台运行结果

#创建一个3级子目录./a1/b2/c3
setwd(“B:/Temp2/“)
getwd()
[1] “B:/Temp2”
list.dirs()
[1] “.” “./data” “./test”
[4] “./test/3组李世昱组” “./test/3组李世昱组/2017016427李世昱” “./test/3组李世昱组/2017016427李世昱/R脚本”
[7] “./test/3组李世昱组/2017016427李世昱/tiff文件” “./test/3组李世昱组/2017016427李世昱1” “./test/3组李世昱组/2017016427李世昱2”
[10] “./外文件夹_1” “./外文件夹_10” “./外文件夹_2”
[13] “./外文件夹_3” “./外文件夹_4” “./外文件夹_5”
[16] “./外文件夹_6” “./外文件夹_7” “./外文件夹_8”
[19] “./外文件夹_9” “./外文件夹1” “./外文件夹1/内文件夹”
[22] “./外文件夹10” “./外文件夹10/内文件夹” “./外文件夹2”
[25] “./外文件夹2/内文件夹” “./外文件夹3” “./外文件夹3/内文件夹”
[28] “./外文件夹4” “./外文件夹4/内文件夹” “./外文件夹5”
[31] “./外文件夹5/内文件夹” “./外文件夹6” “./外文件夹6/内文件夹”
[34] “./外文件夹7” “./外文件夹7/内文件夹” “./外文件夹8”
[37] “./外文件夹8/内文件夹” “./外文件夹9” “./外文件夹9/内文件夹”
[40] “./月数据格点数据集” “./月数据格点数据集/降水” “./月数据格点数据集/气温”
dir.create(path = “a1/b2/c3”) #直接创建,出错
Warning message:
In dir.create(path = “a1/b2/c3”) :
由于’No such file or directory’的原因,无法建立’a1\b2\c3’文件目录
dir.create(path=”a1/b2/c3”,recursive = TRUE)
system(“tree”)
卷 新加卷 的文件夹 PATH 列表
卷序列号为 3001-56A6
B:.
├─a1
│ └─b2
│ └─c3
├─data
├─test
│ └─3组李世昱组
│ ├─2017016427李世昱
│ │ ├─R脚本
│ │ └─tiff文件
│ ├─2017016427李世昱1
│ └─2017016427李世昱2
├─外文件夹1
│ └─内文件夹
├─外文件夹10
│ └─内文件夹
├─外文件夹2
│ └─内文件夹
├─外文件夹3
│ └─内文件夹
├─外文件夹4
│ └─内文件夹
├─外文件夹5
│ └─内文件夹
├─外文件夹6
│ └─内文件夹
├─外文件夹7
│ └─内文件夹
├─外文件夹8
│ └─内文件夹
├─外文件夹9
│ └─内文件夹
├─外文件夹_1
├─外文件夹_10
├─外文件夹_2
├─外文件夹_3
├─外文件夹_4
├─外文件夹_5
├─外文件夹_6
├─外文件夹_7
├─外文件夹_8
├─外文件夹_9
└─月数据格点数据集
├─气温
└─降水
[1] 0

Paste函数

paste(..., sep = " ", collapse = NULL)

- 表示要组合的任何数量的参数。

sep - 表示参数之间的分隔符。它是任选的。

collapse - 用于消除两个字符串之间的空间。但不是在一个字符串的两个词的空间

paste("a","b",sep = "=")#注意到用等号分隔了

paste("a",1:5,sep = "")#会自动每个元素与a相连

paste("a",1:5,".pdf", sep = "")#比如想批量输出文件名

#collapse用于消除两个字符串之间的空间。但不是在一个字符串的两个词的空间
a<-"李世昱"
b<-"一定会上岸"
c<-"的!"
paste(a,b,c,sep = "") 
paste("a","b",sep = "",collapse = "") 

控制台运行结果

paste(“a”,”b”,sep = “=”)#注意到用等号分隔了
[1] “a=b”

paste(“a”,1:5,sep = “”)#会自动每个元素与a相连
[1] “a1” “a2” “a3” “a4” “a5”

paste(“a”,1:5,”.pdf”, sep = “”)#比如想批量输出文件名
[1] “a1.pdf” “a2.pdf” “a3.pdf” “a4.pdf” “a5.pdf”

#collapse用于消除两个字符串之间的空间。但不是在一个字符串的两个词的空间
a<-“李世昱”
b<-“一定会上岸”
c<-“的!”
paste(a,b,c,sep = “”)
[1] “李世昱一定会上岸的!”
paste(a,b,c,sep = “”,collapse = “”)
[1] “李世昱一定会上岸的!”

好像collapse并没有起什么作用:wheel_of_dharma:


六、空间数据操作

shp

将CSV输出为shp

rm(list = ls())
setwd("B:/Temp2")
#导包-------------------------------------
library(maptools)
library(rgdal)
library(sp)

#若无,则安装包----------------------------------
#install.packages("maptools")
#install.packages("rgdal")
#install.packages("sp")

#读取数据-------------------------------
df<-read.csv("data/StationInfo.csv",header = T)

#设定经纬度字段--------------------------
coordinates(df)<-~Lon+Lat 
#设置投影参数-----------------------------
proj4string(df)<-CRS("+proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0") #设置投影
#writeOGR函数导出数据----------------------
writeOGR(df,
         dsn = "B:/Temp2/test",#设置输出路径
         layer = "stationinfo1",#设置保存名称
         driver = "ESRI Shapefile",#设置输出类型
         overwrite_layer = T #是否覆盖
         )

raster

自造数据并plot造出来的raster

rm(list = ls())
library(raster)
#生成矩阵,72行,128列,数值为1--------------------
df<-matrix(nrow = 72,ncol = 128,1)
#生成矩阵,72行,128列,数值为0-999之间随机的72个数-------------------
#df<-matrix(nrow = 72,ncol = 128,runif(72,0,999))

#生成raster数据-----------------------------------------------

df1<-raster(df,#数据源
            xmn=72,#x轴最小值
            xmx=128,#x最大值
            ymn=18,
            ymx=54,
            crs<-CRS("+proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0")#投影
            )
plot(df1)

当自造数据为

df<-matrix(nrow = 72,ncol = 128,runif(72,0,999))

其plot输出为

输出raster——writeRaster函数

setwd("B:/Temp2/月数据格点数据集/降水/")
r<-raster("SURF_CLI_CHN_PRE_MON_GRID_0.5-201401.txt")
proj4string(r)<-CRS("+proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0")
writeRaster(r,#数据源
            filename = '201401.tiff',#可写全路径,输出指定位置
            format="GTiff",#输出格式
            overwrite=T#是否覆盖
            )

raster作业1:求年降水量的总和

文件、目录环境

单个文件

代码解释

#降水年总和--------------------------------------------------------------
rm(list = ls())
library(raster)
library(sp)
setwd("B:/Temp2/月数据格点数据集/降水/")

#文件名存入列表中-----------------------
PrecipitationFiles<-list.files()

#得指定初始r,在此基础上累加------------
r<-raster(PrecipitationFiles[1])

#以for循环进行累加----------------------
for (i in PrecipitationFiles) {
  r<-raster(i)+r
  proj4string(r)<-CRS("+proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0")
}
writeRaster(r,
            filename = "Sum2014",
            format="GTiff",#输出格式
            overwrite=T#是否覆盖
            )
print(r) #查看栅格信息
print("Succeeded! 完成年降水总和计算")

作业2:求各年降水的最大值的平均值

文件、目录环境

单个文件

代码解释

#各年最高气温平均-------------------------------------------------------------
rm(list = ls())
library(raster)
library(sp)
setwd("B:/Temp2/月数据格点数据集/气温/")
#筛选出最高气温-------------------------
AirTemperatureFlies<-list.files(pattern = "MAX")

#得指定初始r,在此基础上累加------------
r<-raster(AirTemperatureFlies[1])

for (i in AirTemperatureFlies) {
  r<-raster(i)+r
  proj4string(r)<-CRS("+proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0")
  }
#在循环累加完成后,进行平均值计算并输出
writeRaster(r/12,
            filename = "Max_Mean",
            format="GTiff",#输出格式
            overwrite=T#是否覆盖
)
print(r/12) #查看栅格信息
print("Succeeded! 完成各年最高气温平均计算")

文章作者: 李世昱
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 李世昱 !
评论
  目录