前言:

2020 好好坏坏也都过去了,2021 年平平安安,趁过节有空打算学点东西,选择了 R 语言。
过去一直听说,R 语言是做数据分析的好帮手,测试数据分析过去都是用 Python 做的,Python 的 Pd 和 np 是最常见的,但是写起来代码也并不省事,尤其是处理集合数据的关系,目前公司还没来得及开始做这,通过 R 语言来试试是否可以做这块,多学门语言也能对修修补补以前学习其他语言过程中不理解的地方。
读本文会提升对 R 学习速度,也会对 R 语言和其他语言一些共性地方做提取。

安装和 workdirectory

1.下载 R 官网 http://mirror.fcaglp.unlp.edu.ar/CRAN/
这个里面还有多个语言的版本,选择最新版本好了 base Binaries for base distribution. This is what you want to install R for the first time.
不要安装 C 盘,一路安装没啥特别的。安装后的路径\R\R-4.0.3\
\R\R-4.0.3\bin\R.exe 是打开命令行窗体的输入 cli 模式,Rscript.exe 是运行 R 脚本的和其他语言一样,
\R\R-4.0.3\bin 这个路径需要配置环境变量,这样可以用 Rscript 来运行 R 脚本。
推荐编辑器可以使用 idea 公司的插件 R Language for IntelliJ,社区版的也可以下载到,真香。
安装插件后,因为 R 执行速度和你的机器内存大小有关,可以吧当前软件的内存分配大一点。
在 R Console 里面输入 install.packages("pacman"),pacman 是管理包的工具,负责包的加载。

2.workDirectory
查询当前的 workDirectory,R 语言 print 是打印,打印加说明可以使用字符串拼接。

# paste0是字符串拼接时不带1个位置空格 paste是2个对象中间会多一个空格
print(paste0("workDirectory->",getwd()))

设置 workDirectory,这个什么用途和 Python 的 os.chrdi 是完全一样的,定义当前的目录空间。
这个用途比如是可以做跨项目调用,可以设置绝对路径的 workDirectory.
R 语言对于盘符和路径有严格要求,E:/stream 是合法的,直接从目录下取出来的 E:\stream 是不合法的

dir.create("E:/stream") #如果这个目录需要创建等同os.mkdir(path)
setwd("E:/stream")
print(paste0("workdirectory->",getwd()))

dir.create 只有 Python 的 os.mkdir 一级目录,没有联级目录创建的方式。如果要建立深层次的目录,需要多个 dir.create()
其他语言做这块设置时,都会先判断一级目录是否存在。
R 语言语法是 if(条件表达式),dir.exists 返回是是逻辑条件类型(也就是其他语言布尔类型)。
! 在 R 语言里面和 Js 的取反一样,function 是函数关键字,函数创建出来后赋值给一个对象,R 语言赋值有多种形式。
最推荐的是 obj <-function() ,obj =function(),function()->obj 也是赋值。
下面文章都会用函数式去写。

# 创建Dir
createDir <-function(){
    if(!dir.exists("E:/chenxiaomao")){
        dir.create("E:/chenxiaomao")
        dir.create("E:/chenxiaomao/chenzhongmao")
        dir.create("E:/chenxiaomao/chenzhongmao/chendamao")
    }
    #
    return(dir.exists("E:/chenxiaomao/chenzhongmao/chendamao"))
}
print(paste0("createDirPath=>",createDir()))
setwd("E:/chenxiaomao/chenzhongmao/chendamao")
print(paste0("workdirectory->",getwd()))

思想和其他语言开发一样,创建后然后检查下是否目录成功。

R 语言向量

c 里面可以包含各种数据,这种是一种异同的数据。

z <<- c("1 cat",100,"3","end cat")  
print(class(z)) #class是看对象z数据类型的 "character"
print(z) #一旦被c包装就变成叫向量vector

vector 是重要的数据结构,里面需要存放同一种数据类型的,这里因为其他的都是字符串,所以 100 会变成了 character。

print(z[1] =="no cat")  #FALSE
z1 = c(TRUE,"1","2") #TRUE 1 2

z[1] 里面不是索引,而是一个取出对象第几个位置的方法。这样 TRUE 就被添加到集合。
往向量里面添加了一段数据,然后对这些数据做一些切割,比如是说取出一段数据。

n <- c(1:10)  #都是Integer
print(n)
v <- LETTERS[1:6]  #字符串LETTERS是大写
print(v)
#取出一段数据并且可以判断向量里面进行判断
v1 <- v[2:4]
v2 <- v[c(2:4)]
print(v1==v2) #会一个个位置进行判断

最后判断会打印 TRUE,TRUE,TRUE。(这块关于向量的逐个位置进行比较,后面会进行描述)
上面的方式更推荐使用 v1 的,原因是 v 本身就是向量,向量套向量可行。
上面是提取数据,如果是过滤数据可以用下面方式。

v3 <-v[-1:-3] #[]里面的一个范围的,如果第一个数是-负,第二个数也只能是正数
print(v3)
v4 <-v[c(-1:-3)] #这个和前面是一样的,v3==v4。
print(v3==v4)

过滤条件的数据是包含了运算表达式的。

n <- c(1:10)  #都是Integer
print(n[which(3<=n&n<=7)])

v <- LETTERS[1:6] 
v0 <- v[which("b"<=v&v< "f")]
print(v0)

这里不能用&&,R 里面的逻辑与是&,min < n <max 这种不合适 R 语言和 Python 不一样。
v 里面向量是大写的,但是 which 进行过滤条件时,小写 a 一样可以判断 A,可能和 wins 不区分大小写有关,没继续研究。
学习 R 需要严格记住 c(min:max) 是声明和包含。但是如果已经声明出来的,需要使用 vector 向量里面的其他方法,就是用 []。下面做一层简单的封装。

vcFilter <- function(vc,min,max){
    if(!is.integer(vc)){
        print("string type")
        return(vc[which(min<vc&vc<max)])
    }else if(is.integer(vc)){
        return(vc[which(min<=vc&vc<=max)])
    }
}
#大于并且等于不限制int类型和字符串类型,这里只是做一个范例

这里有个新的知识点是 is.integer 是一个个判断里面的。is.vector 是判断 R 语言数据类型的,前面介绍的都是向量。

矩阵

把向量转换成矩阵,row(行) 和 col(列)

#生成矩阵
genMatrix <- function(v,row,col){
    return(matrix(v,row,col))
}
a <- 1:9 # 如果max=10,数据长度[10]不是矩阵行数[3]的整倍。
result <- genMatrix(a,3,3)
print(result)

matrix(向量对象,行,列)记下这个公式,可以方便后面写时不用查书。最终输出是下面的。

     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    6
[3,]    7    8    9
#取出7 看上面图是很好理解
print(result[3,1]) 
print(result[2,3]) #6 

这个可以多练习下会发现 R 语言是一直也是编译器做越界判断。
给矩阵美容,替换 col 的 title 数据和 row 的 title 数据,就是用下面二个方法去包裹住

m1 <- matrix(result, 2, 3, byrow=TRUE)
colnames(m1) = c("a", "b", "x")
rownames(m1) = c("a", "b")

matrix 推荐做法是用通过 nrow 设置行数,就不用单独处理列了

#公式是matrix(向量,nrow=x)nrow=行长度
genMatrixV1 <- function(v,rowNum){
    return(matrix(v,nrow=rowNum))
}
print(genMatrixV1(result,3))

这个里面有兴趣的话,可以看下 colnames 的方法,R 语言还是属于包装的比较好的方法。
下面有个函数,可以来论证下 R 语言的矩阵的读取顺序是先读完第一列,然后第二列
这个的原因是

     [,1] [,2] [,3]
[1,]    1    4    2
[2,]    5    3    6
print(m1 %in% 5) #去匹配矩阵数据顺序里面
#5是第2个位置TRUE console: [1] FALSE  TRUE FALSE FALSE FALSE FALSE

可以去试试别的%in% 后面输入别的,下个文章还会继续对矩阵进行描述。

结论

R 语言还是一个值得研究和学习的语言,可以期待下后面的文章,会有具体落地的测试数据分析的。
测试不该那么小。


↙↙↙阅读原文可查看相关链接,并与作者交流