怎样才能学好电脑的R语言?

Python012

怎样才能学好电脑的R语言?,第1张

R语言快速入门:数据结构+生成数据+数据引用+读取外部数据

查看完整文档可至百度网盘:

链接: https://pan.baidu.com/s/1cEdmpO5idfxx044TpqVBuA

 

提取码: bi3t

R是用于统计分析、绘图的语言和操作环境。R是属于GNU系统的一个自由、免费、源代码开放的软件,它是一个用于统计计算和统计制图的优秀工具。常被用于统计学、计量分析等领域。接下来讲一下我个人认为的R入门知识。

目录

1 数据结构

1.1 向量

1.2 矩阵

1.3 数据框

2 生成数据

2.1 c() 连接单个数据

2.2 ":" 生成1/-1等差向量

2.3 seq() 生成等距向量

2.4 rep() 生成重复数据

3 数据引用

3.1 引用行/引用列

3.2 引用单个元素

3.3 引用子矩阵

3.4 变量名引用

4 读取外部数据(表)

4.1 更改工作目录

4.2 read.table

4.3 read.csv

正文 1 数据结构

本节主要讲向量、矩阵、数据框三种数据结构(入门必须学)

1.1 向量

用于存储数值型、字符型或逻辑型数据的一维数组,常用"c()"创建。例如:

> c(1,2,8)#生成包含1,2,8的一维数组(向量)

[1] 1 2 8

1.2 矩阵

二维数组具有行列的概念

#矩阵用法

matrix(data = NA, nrow = 1, ncol = 1, byrow = FALSE,dimnames = NULL) #表示生成1行,1列的一个矩阵,其中仅仅包含一个元素“NA” #---示例---#

> matrix(c(1,2,3, 11,12,13), nrow = 2, ncol = 3, byrow = TRUE, dimnames = list(c("row1", "row2"), c("C.1", "C.2", "C.3")))

     C.1 C.2 C.3

row1   1   2   3

row2  11  12  13

#nrow = 2和ncol = 3 定义2x3的2行3列矩阵

#byrow = TRUE 是控制矩阵中的数据c(1,2,3, 11,12,13)按照行的顺序排列,默认按照列排列

#dimnames = list(c("row1", "row2"), c("C.1", "C.2", "C.3")) 定义矩阵行名和列名

1.3 数据框

主要用于向量/矩阵合并,可以将不通类型的以向量以及矩阵,按照一定结构存储在数据框中。

> x <- c(11:20)  #其中" <- "是赋值的意思,将向量c(11:20)赋值给对象x

> y <- c(1:10)

> data.frame(xf = x, yf = x) #将向量x和y合并存储到数据框中,并重命名为xf和yf

   xf yf

1  11 11

2  12 12

3  13 13

4  14 14

5  15 15

6  16 16

7  17 17

8  18 18

9  19 19

10 20 20

数组与矩阵类似,但其维度大于2.由于R入门基本接触不到3维以上数组的概念,目前暂不展开,等入门后在反过来看。

2 生成数据

本节主要讲“c()”、":"、seq、rep等四种数据生成的内容(入门必须学)

2.1 “c”  连接单个数据

> c(1,2,8)#生成包含1,2,8的向量

2.2 “:“ 生成1/-1等差向量

> 1.1:10

[1] 1.1 2.1 3.1 4.1 5.1 6.1 7.1 8.1 9.1

> 1:10

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

> 10:1 #如x=1:10(递减,如y=10:1)

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

2.3 seq 生成等距向量

①seq(起点,终点,步长) 

②seq(length=9, from=1, to=5)

> seq(1,10,2)

[1] 1 3 5 7 9

> seq(length=5,1,10)

[1]  1.00  3.25  5.50  7.75 10.00

#seq(x)相当于1:length(x);length(x)为0时,返回integer(0)

> seq(10)

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

> seq(c())

integer(0)

2.4 rep(x,n)   重复 

将x重复n次,可使用each限定为依次重复形式

rep(1:3,3)

rep(1:3,each=3)

#> rep(1:3,3)

#[1] 1 2 3 1 2 3 1 2 3

#> rep(1:3,each = 3)

#[1] 1 1 1 2 2 2 3 3 3

额外补充:R语言|第2讲:生成数据

3 数据引用(以矩阵为例)

数据引用必须懂“对指定维度数据的引用”(以二维矩阵为例)

3.1 行引用/列引用

例如:引用第一行数据,引用第一列数据,引用第一行第一列的数据。

> data(iris) #鸢尾花数据集> dim(iris) #读取iris数据集的维度数值,以“行数 列数 ”形式展示[1] 150   5   #说明iris数据集是150 x 5的二维数组

3.2 行列值引用:数据集[行值,列值]

如行值或列值仅1个数字,表示仅引用该行或列的数据

> iris[1,]  #引用第1行数据

  Sepal.Length Sepal.Width Petal.Length Petal.Width Species

1          5.1         3.5          1.4         0.2  setosa

> head(iris[,1],5) #引用第1列的数据,其中因数据过长,使用head()函数取前5个数字

[1] 5.1 4.9 4.7 4.6 5.0

3.3 引用子矩阵

如行值或列值为组合数据,则表示引用组合行列交叉位置的数据

> iris[1:5,1:3]

  Sepal.Length Sepal.Width Petal.Length

1          5.1         3.5          1.4

2          4.9         3.0          1.4

3          4.7         3.2          1.3

4          4.6         3.1          1.5

5          5.0         3.6          1.4

3.4 变量名引用

(多用于二维数组中):数据集$变量名

> head(iris$Petal.Length,5)

[1] 1.4 1.4 1.3 1.5 1.4 4 读取外部数据(以.csv表为例)

本节主要讲如何读取外部数据(表)(以.csv表为例)

4.1 设置工作目录

R语言中数据的输入需要设置数据读取的路径,一般将数据文件放到工作目录下,这样直接就可以通过read.table等读取数据文档(不许要设置路径)。

setwd("E:/")  #设置当前工作目录为"E:/"

getwd()  #读取当前工作空间的工作目录(文件读取保存路径)

> getwd()  #读取当前工作空间的工作目录(文件读取保存路径)

[1] "C:/Users/ysl/Documents"

> setwd("E:/") #设置当前工作目录为"E:/"

> getwd() #再次使用getwd()函数即可查看是否设置成功

[1] "E:/"

方法二:通过R-gui菜单栏设置(文件-改变工作目录)

4.2 read.table() 

#读取带分隔符的文本文件。read.table()函数是R最基本函数之一,读取带分隔符的文本/表格文件。

#Usage

read.table(file, header = FALSE, sep = "", quote = "\"'",

           dec = ".", numerals = c("allow.loss", "warn.loss", "no.loss"),

           row.names, col.names, as.is = !stringsAsFactors,

           na.strings = "NA", colClasses = NA, nrows = -1,

           skip = 0, check.names = TRUE, fill = !blank.lines.skip,

           strip.white = FALSE, blank.lines.skip = TRUE,

           comment.char = "#",

           allowEscapes = FALSE, flush = FALSE,

           stringsAsFactors = default.stringsAsFactors(),

           fileEncoding = "", encoding = "unknown", text, skipNul = FALSE)

read.csv(file, header = TRUE, sep = ",", quote = "\"",

dec = ".", fill = TRUE, comment.char = "", ...)

read.csv2(file, header = TRUE, sep = "", quote = "\"",

dec = ",", fill = TRUE, comment.char = "", ...)

read.delim(file, header = TRUE, sep = "\t", quote = "\"",

dec = ".", fill = TRUE, comment.char = "", ...)

read.delim2(file, header = TRUE, sep = "\t", quote = "\"",

            dec = ",", fill = TRUE, comment.char = "", ...)

常用参数的说明如下:

(1)file:file是一个带分隔符的ASCII文本文件。①绝对路径或者相对路径。一定要注意,在R语言中\是转义符,所以路径分隔符需要写成"\\"或者“/”。所以写成“C:\\myfile\\myfile.txt”或者“C:/myfile/myfile.txt”即可。②使用file.choose(),弹出对话框,自动选择文件位置。例如:read.table(file.choose(),...)。

(2)header:一个表示文件是否在第一行包含了变量的逻辑型变量。如果header设置为TRUE,则要求第一行要比数据列的数量少一列。

(3)sep分开数据的分隔符。默认sep=""。read.table()函数可以将1个或多个空格、tab制表符、换行符或回车符作为分隔符。常见空白分隔符有:空格,制表符,换行符

sep=” ”;sep = “\t”;sep = “\n”

(4)stringsAsFactors 逻辑值,标记字符向量是否需要转化为因子,默认是TRUE。stringsAsFactors = F意味着,“在读入数据时,遇到字符串之后,不将其转换为factors,仍然保留为字符串格式”。

(5)encoding 设定输入字符串的编码方式。

#读取txt文档

> df<- read.table("data.txt")

> df

V1 V2

1  x  y

2  1  2

3  3  4

4  5  6

> df <- read.table("data.txt",header = T)

> df

x y

1 1 2

2 3 4

3 5 6

#样式1:直接读取数据

> df <- read.table("data.csv")  #直接读取数据

> head(df)

V1

1 ID,Sepal.Length,Sepal.Width,Petal.Length,Petal.Width,Species

2                                     1,5.1,3.5,1.4,0.2,setosa

3                                       2,4.9,3,1.4,0.2,setosa

4                                     3,4.7,3.2,1.3,0.2,setosa

5                                     4,4.6,3.1,1.5,0.2,setosa

6                                       5,5,3.6,1.4,0.2,setosa

#样式2:读数+首行表头

> df <- read.table("data.csv",header = T)  #读数+首行表头

> head(df)

ID.Sepal.Length.Sepal.Width.Petal.Length.Petal.Width.Species

1                                     1,5.1,3.5,1.4,0.2,setosa

2                                       2,4.9,3,1.4,0.2,setosa

3                                     3,4.7,3.2,1.3,0.2,setosa

4                                     4,4.6,3.1,1.5,0.2,setosa

5                                       5,5,3.6,1.4,0.2,setosa

6                                     6,5.4,3.9,1.7,0.4,setosa

#样式3:读数+首行表头+","逗号分割

> df <- read.table("data.csv",header = T,sep=",")  

#读数+首行表头+","逗号分割

> head(df)

ID Sepal.Length Sepal.Width Petal.Length Petal.Width Species

1  1          5.1         3.5          1.4         0.2  setosa

2  2          4.9         3.0          1.4         0.2  setosa

3  3          4.7         3.2          1.3         0.2  setosa

4  4          4.6         3.1          1.5         0.2  setosa

5  5          5.0         3.6          1.4         0.2  setosa

6  6          5.4         3.9          1.7         0.4  setosa

> summary(df)

ID          Sepal.Length    Sepal.Width     Petal.Length  

Min.   :  1.00   Min.   :4.300   Min.   :2.000   Min.   :1.000  

1st Qu.: 38.25   1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.600  

Median : 75.50   Median :5.800   Median :3.000   Median :4.350  

Mean   : 75.50   Mean   :5.843   Mean   :3.057   Mean   :3.758  

3rd Qu.:112.75   3rd Qu.:6.400   3rd Qu.:3.300   3rd Qu.:5.100  

Max.   :150.00   Max.   :7.900   Max.   :4.400   Max.   :6.900  

Petal.Width          Species  

Min.   :0.100   setosa    :50  

1st Qu.:0.300   versicolor:50  

Median :1.300   virginica :50  

Mean   :1.199                  

3rd Qu.:1.800                  

Max.   :2.500

#样式4:读数+首行表头+","逗号分割+字符转因子factor

> df <- read.table("data.csv",header = T,sep=",",stringsAsFactor = T)

##读数+首行表头+","逗号分割+字符转因子factor

> head(df)

ID Sepal.Length Sepal.Width Petal.Length Petal.Width Species

1  1          5.1         3.5          1.4         0.2  setosa

2  2          4.9         3.0          1.4         0.2  setosa

3  3          4.7         3.2          1.3         0.2  setosa

4  4          4.6         3.1          1.5         0.2  setosa

5  5          5.0         3.6          1.4         0.2  setosa

6  6          5.4         3.9          1.7         0.4  setosa

 #请注意species结果与样式3中结果的差异

> summary(df) 

ID          Sepal.Length    Sepal.Width     Petal.Length  

Min.   :  1.00   Min.   :4.300   Min.   :2.000   Min.   :1.000  

1st Qu.: 38.25   1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.600  

Median : 75.50   Median :5.800   Median :3.000   Median :4.350  

Mean   : 75.50   Mean   :5.843   Mean   :3.057   Mean   :3.758  

3rd Qu.:112.75   3rd Qu.:6.400   3rd Qu.:3.300   3rd Qu.:5.100  

Max.   :150.00   Max.   :7.900   Max.   :4.400   Max.   :6.900  

Petal.Width          Species  

Min.   :0.100   setosa    :50  

1st Qu.:0.300   versicolor:50  

Median :1.300   virginica :50  

Mean   :1.199                  

3rd Qu.:1.800                  

 Max.   :2.500

4.3 read.csv()  

#读取.csv格式数据,read.table的一种特定应用。read.csv() 读取逗号分割数据文件,read.table()的一种特定应用。默认逗号分割,header=T,stringsAsFactor = T

df <- read.csv("data.csv") #等价与下df <- read.table("data.csv",header = T,sep=",",stringsAsFactor = T)df <- read.table("data.csv",header = T,sep=",",stringsAsFactor = T)#第一行和第二行等价

read.csv(file, header = TRUE, sep = ",", quote = "\"", 

dec = ".", fill = TRUE, comment.char = "", ...)

#实例

> df <- read.csv("data.csv") 

#相当于df <- read.table("data.csv",header = T,sep=",",stringsAsFactor = T)

> head(df)

ID Sepal.Length Sepal.Width Petal.Length Petal.Width Species

1  1          5.1         3.5          1.4         0.2  setosa

2  2          4.9         3.0          1.4         0.2  setosa

3  3          4.7         3.2          1.3         0.2  setosa

4  4          4.6         3.1          1.5         0.2  setosa

5  5          5.0         3.6          1.4         0.2  setosa

6  6          5.4         3.9          1.7         0.4  setosa

执行语句写在方法里面sai :

public class dbbean {

public Connection getOrcaleConn(){

try{

DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver())

Connection con=DriverManager.getConnection("jdbc:oracle:thin:@133.81.9.101:1521:tongji","tongji","qazwsx")

}

catch(SQLException ce){

ce.printStackTrace()

}

return con

}

}

数据科学入门丨选Python还是R

对于想入门数据科学的新手来说,选择学Python还是R语言是一个难题,本文对两种语言进行了比较,希望能帮助你做出选择。

我是德勤的数据科学家主管,多年来我一直在使用Python和R语言,并且与Python社区密切合作了15年。本文是我对这两种语言的一些个人看法。

第三种选择

针对这个问题,Studio的首席数据科学家Htley Wickham认为,比起在二者中选其一,更好的选择是让两种语言合作。因此,这也是我提到的第三种选择,我在文本最后部分会探讨。

如何比较R和Python

对于这两种语言,有以下几点值得进行比较:

· 历史:

R和Python的发展历史明显不同,同时有交错的部分。

· 用户群体:

包含许多复杂的社会学人类学因素。

· 性能:

详细比较以及为何难以比较。

· 第三方支持:

模块、代码库、可视化、存储库、组织和开发环境。

· 用例:

根据具体任务和工作类型有不同的选择。

· 是否能同时使用:

在Python中使用R,在R中使用Python。

· 预测:

内部测试。

· 企业和个人偏好:

揭晓最终答案。

历史

简史:

ABC语言 - >Python 问世(1989年由Guido van Rossum创立) - >Python 2(2000年) - >Python 3(2008年)

Fortan语言 - >S语言(贝尔实验室) - >R语言问世(1991年由Ross Ihaka和Robert Gentleman创立) - >R 1.0.0(2000年) - >R 3.0.2(2013年)

用户群体

在比较Python与R的使用群体时,要注意:

只有50%的Python用户在同时使用R。

假设使用R语言的程序员都用R进行相关“科学和数字”研究。可以确定无论程序员的水平如何,这种统计分布都是真实。

这里回到第二个问题,有哪些用户群体。整个科学和数字社区包含几个子群体,当中存在一些重叠。

使用Python或R语言的子群体:

· 深度学习

· 机器学习

· 高级分析

· 预测分析

· 统计

· 探索和数据分析

· 学术科研

· 大量计算研究领域

虽然每个领域几乎都服务于特定群体,但在统计和探索等方面,使用R语言更为普遍。在不久之前进行数据探索时,比起Python,R语言花的时间更少,而且使用Python还需要花时间进行安装。

这一切都被称为Jupyter Notebooks和Anaconda的颠覆性技术所改变。

Jupyter Notebook:增加了在浏览器中编写Python和R代码的能力

Anaconda:能够轻松安装和管理Python和R。

现在,你可以在友好的环境中启动和运行Python或R,提供开箱即用的报告和分析,这两项技术消除了完成任务和选择喜欢语言间的障碍。Python现在能以独立于平台的方式打包,并且更快地提供快速简单的分析。

社区中影响语言选择的另一个因素是“开源”。不仅仅是开源的库,还有协作社区对开源的影响。讽刺的是,Tensorflow和GNU Scientific Library等开源软件(分别是Apache和GPL)都与Python和R绑定。虽然使用R语言的用户很多,但使用Python的用户中有很多纯粹的Python支持者。另一方面,更多的企业使用R语言,特别是那些有统计学背景的。

最后,关于社区和协作,Github对Python的支持更多。如果看到最近热门的Python包,会发现Tensorflow等项目有超过3.5万的用户收藏。但看到R的热门软件包,Shiny、Stan等的收藏量则低于2千。

性能

这方面不容易进行比较。

原因是需要测试的指标和情况太多。很难在任何一个特定硬件上测试。有些操作通过其中一种语言优化,而不是另一种。

循环

在此之前让我们想想,如何比较Python与R。你真的想在R语言写很多循环吗?毕竟这两种语言的设计意图不太相同。

{

"cells": [

{

"cell_type": "code",

"execution_count": 1,

"metadata": {},

"outputs": [],

"source": [

"import numpy as npn",

"%load_ext rpy2.ipython"

]

},

{

"cell_type": "code",

"execution_count": 2,

"metadata": {},

"outputs": [],

"source": [

"def do_loop(u1):n",

"n",

"# Initialize `usq`n",

"usq = {}n",

"n",

"for i in range(100):n",

" # i-th element of `u1` squared into `i`-th position of `usq`n",

" usq[i] = u1[i] * u1[i]n"

]

},

{

"cell_type": "code",

"execution_count": 3,

"metadata": {},

"outputs": [],

"source": [

"%%Rn",

"do_loop <- function(u1) {n",

"n",

"# Initialize `usq`n",

"usq <- 0n",

"n",

"for(i in 1:100) {n",

" # i-th element of `u1` squared into `i`-th position of `usq`n",

" usq[i] <- u1[i]*u1[i]n",

"}n",

"n",

"}"

]

},

{

"cell_type": "code",

"execution_count": 4,

"metadata": {},

"outputs": [

{

"name": "stdout",

"output_type": "stream",

"text": [

"1.58 ms ± 42.8 ?s per loop (mean ± std. dev. of 7 runs, 1000 loops each)n"

]

}

],

"source": [

"%%timeit -n 1000n",

"%%Rn",

"u1 <- rnorm(100)n",

"do_loop(u1)"

]

},

{

"cell_type": "code",

"execution_count": 5,

"metadata": {},

"outputs": [

{

"name": "stdout",

"output_type": "stream",

"text": [

"36.9 ?s ± 5.99 ?s per loop (mean ± std. dev. of 7 runs, 1000 loops each)n"

]

}

],

"source": [

"%%timeit -n 1000n",

"u1 = np.random.randn(100)n",

"do_loop(u1)"

]

}

],

"metadata": {

"kernelspec": {

"display_name": "Python 3",

"language": "python",

"name": "python3"

},

"language_info": {

"codemirror_mode": {

"name": "ipython",

"version": 3

},

"file_extension": ".py",

"mimetype": "text/x-python",

"name": "python",

"nbconvert_exporter": "python",

"pygments_lexer": "ipython3",

"version": "3.6.3"

}

},

"nbformat": 4,

"nbformat_minor": 2

}

Python为0.000037秒,R为0.00158秒

包括加载时间和在命令行上运行:R需要0.238秒,Python需要0.147秒。强调,这并不是科学严谨的测试。

测试证明,Python的运行速度明显加快。通常这并没有太大影响。

除了运行速度外,对于数据科学家而言哪种性能更重要?两种语言之所以受欢迎是因为它们能被用作命令语言。例如,在使用Python时大多时候我们都很依赖Pandas。这涉及到每种语言中模块和库,以及其执行方式。

第三方支持

Python有PyPI,R语言有CRAN,两者都有Anaconda。

CRAN使用内置的install.packages命令。目前,CRAN上有大约1.2万个包。其中超过1/2的包都能用于数据科学。

PyPi中包的数量超过前者的10倍,约有14.1万个包。专门用于科学工程的有3700个。其中有些也可以用于科学,但没有被标记。

在两者中都有重复的情况。当搜索“随机森林”时,PyPi中可以得到170个项目,但这些包并不相同。

尽管Python包的数量是R的10倍,但数据科学相关的包的数量大致相同。

运行速度

比较DataFrames和Pandas更有意义。

我们进行了一项实验:比较针对复杂探索任务的执行时间,结果如下:

在大多数任务中Python运行速度更快。

http://nbviewer.jupyter.org/gist/brianray/4ce15234e6ac2975b335c8d90a4b6882

可以看到,Python + Pandas比原生的R语言DataFrames更快。注意,这并不意味着Python运行更快,Pandas 是基于Numpy用C语言编写的。

可视化

这里将ggplot2与matplotlib进行比较。

matplotlib是由John D. Hunter编写的,他是我在Python社区中最敬重的人之一,他也是教会我使用Python的人。

Matplotlib虽然不易学习但能进行定制和扩展。ggplot难以进行定制,有些人认为它更难学。

如果你喜欢漂亮的图表,而且无需自定义,那么R是不错的选择。如果你要做更多的事情,那么Matplotlib甚至交互式散景都不错。同样,R的ShinnyR能够增加交互性。

是否能同时使用

可能你会问,为什么不能同时使用Python和R语言?

以下情况你可以同时使用这两种语言:

· 公司或组织允许;

· 两种都能在你的编程环境中轻松设置和维护;

· 你的代码不需要进入另一个系统;

· 不会给合作的人带来麻烦和困扰。

一起使用两种语言的方法是:

· Python提供给R的包:如rpy2、pyRserve、Rpython等;

· R也有相对的包:rPython、PythonInR、reticulate、rJython,SnakeCharmR、XRPython

· 使用Jupyter,同时使用两者,例子如下:

之后可以传递pandas的数据框,接着通过rpy2自动转换为R的数据框,并用“-i df”转换:

http://nbviewer.jupyter.org/gist/brianray/734bd54f468d9a6db9171b2cfc98405a

预测

Kaggle上有人对开发者使用R还是Python写了一个Kernel。他根据数据发现以下有趣的结果:

· 如果你打算明年转向Linux,则更可能是Python用户;

· 如果你研究统计数据,则更可能使用R;如果研究计算机科学,则更可能使用Python;

· 如果你还年轻(18-24岁),则更可能是Python用户;

· 如果你参加编程比赛,则更可能是Python用户;

· 如果你明年想使用Android,则更可能是Python用户;

· 如果你想在明年学习SQL,则更可能是R用户;

· 如果你使用MS office,则更可能是R用户;

· 如果你想在明年使用Rasperry Pi,则更可能是Python用户;

· 如果你是全日制学生,则更可能是Python用户;

· 如果你使用的敏捷方法(Agile methodology),则更可能是Python用户;

· 如果对待人工智能,比起兴奋你更持担心态度,则更可能是R用户。

企业和个人偏好

当我与Googler和Stack Overflow的大神级人物Alex Martelli交流时,他向我解释了为什么Google最开始只官方支持少数几种语言。即使是在Google相对开发的环境中,也存在一些限制和偏好,其他企业也是如此。

除了企业偏好,企业中第一个使用某种语言的人也会起到决定性作用。第一个在德勤使用R的人他目前仍在公司工作,目前担任首席数据科学家。我的建议是,选择你喜欢的语言,热爱你选择的语言,起到领导作用,并热爱你的事业。

当你在研究某些重要的内容时,犯错是难以避免的。然而,每个精心设计的数据科学项目都为数据科学家留有一些空间,让他们进行实验和学习。重要的是保持开放的心态,拥抱多样性。

最后就我个人而言,我主要使用Python,之后我期待学习更多R的内容。