选自TowardsDataScience
作者:Vihar Kurama
机器之心编译
参与:刘晓坤、许迪
R 语言是结合了 S 编程语言的计算环境,可用于实现对数据的编程;它有很强大的数值分析工具,对于处理线性代数、微分方程和随机学的问题非常有用。通过一系列内建函数和库,你可以用 R 语言学习数据可视化,特别是它还有很多图形前端。本文将简单介绍 R 语言的编程基础,带你逐步实现第一个可视化案例。
代码地址:https://github.com/aaqil/r-lang-fundamentals
R 语言最近刚刚拥有了 TensorFlow 接口,目前最好的 R 语言版本是 R Studio。在学习之前,你需要了解一下 R 语言本身。
为什么要学习 R 语言?
R 语言的代码通用性较好,微调任务后只需要再微调代码就可以直接应用。
R 安装
选择你喜欢的 CRAN 镜像进行安装:https://cran.r-project.org/mirrors.html
R Studio
R Studio 是很高效的版本,它包括一个代码编辑器、调试和可视化工具。它是一个集成开发环境,包括一个控制台、支持直接代码执行的语法高亮显示编辑器,以及绘图、历史查询、调试和工作区管理的工具。
R Studio 下载地址:https://www.rstudio.com/products/rstud
R Studio 快照
交互使用 R 语言
成功安装 R 语言之后,在终端或 shell 里点击「R」启动交互式 shell。
你可以将 R shell 当成计算器使用,执行简单的数学,甚至高级的机器学习算法。
执行以下命令退出 R 程序:
> q()
你可以点击「y」保存工作区会话,如果直接点击「n」,则不保存直接返回终端/shell。
我们从在 R 交互式 shell 中输出「Hello World!」开始学习。
在 R 中我们使用 print() 函数返回参数中给定的字符串:
$R
> print("Hello World!")
[1] "Hello World!"
>
R 语言的命令
R 语言支持命令,而这些命令会被解释器忽略。
以下是一些 R 语言的命令的例子:
# This is a comment in R
# print("This doesn't work")
变量
R 语言的变量可以保存一个原子向量(atomic vector)、一组原子向量或多个 R 对象的组合。R 语言的命名区分大小写。在为数据结构命名的时候,我们需要遵循以下规则:
以. 起始的命名是系统命名,并且使用 ls() 函数时这些命名不总是可见。
a <- 3
上面的代码声明了一个变量「a」并分配了值 3。
typeof() 函数返回变量的数据类型。
type(a)
[1] "double"
R 语言的数据类型
numeric(实数或十进制数):十进制值在 R 语言中被称为 numeric,是默认的计算数据类型。
此外还包括 integer(整数)、charater(字符串)、logical(逻辑值)、complex(复数)等,以下是这些数据类型的定义代码示例:
a <- 3
# Numerical
print(a)
typeof(a)
name <- "Stark"
# Character
print(name)
typeof(name)
holiday <- TRUE
# Logical
print(holiday)
typeof(holiday)
distance <- 1 + 4i
# Complex
print(distance)
typeof(distance)
使用命令「Rscript filename.R」在 shell 上执行 R 文件。
[1] 3
[1] "double"
[1] "Stark"
[1] "character"
[1] TRUE
[1] "logical"
[1] 1+4i
[1] "complex"
注意:R 语言的字符串是 Character 类型的。
算术运算
R 语言可以执行所有基本的算术运算,例如加、减、乘、除等。
# Addition
sum = 4+2
print(sum)
# Subtraction
diff = 6-5
print(diff)
# Multiplication
product = 7*45
print(product)
# Division
div = 50/6
print(div)
# Remainder
rem = 3%%8
print(rem)
# Quotient.
q = 5%/%3
print(q)
# Power
power = 5^3
print(power)
[1] 6
[1] 1
[1] 315
[1] 8.333333
[1] 3
[1] 1
[1] 125
R 语言中的数据结构
原子向量
在 R 语言中,向量是最常用的数据结构。向量是相同类型的数据元素的序列。向量成员的正式名称是成分(component)。向量的元素的数据类型可以是 character、logical、integer 或 numeric。
我们使用 vector() 函数创建一个空向量,以下代码展示了如何声明一个向量:
x <- vector()
> character(5)
[1] "" "" "" "" ""
列表
R 语言的列表作为容器,是包含其它对象的通用向量。和原子向量不同,列表中的变量不局限于单一的数据类型,可以包含任意的数据类型的混合。一个列表可以包含其它列表。
R 语言中的列表可以用 list() 函数创建。
my_list <- list("Red", TRUE, 51.23)
list_1 <- list("Red", TRUE, 51.23)
print(list_1)
# Merging the lists
list_2 <- list(1,2,3)
list_3 <- list("Sun","Mon","Tue")
# Merge the two lists
merged.list <- c(list_2,list_3)
# Print the merged list.
print(merged.list)
[1] "Red"
[[2]]
[1] TRUE
[[3]]
[1] 51.23
[[1]]
[1] 1
[[2]]
[1] 2
[[3]]
[1] 3
[[4]]
[1] "Sun"
[[5]]
[1] "Mon"
[[6]]
[1] "Tue"
矩阵
在 R 语言中,矩阵是一种特殊类型的向量。矩阵是数据元素以二维矩形排布的集合,矩阵有行和列。
现在我们创建一个 2x2 矩阵,使用 matrix 函数并以行和列作为参数。行数以 nrow 表示,列数以 ncol 表示。
my_matrix <- matrix(nrow = 2, ncol = 2)
my_martix <- matrix(nrow = 8, ncol = 4)
# It creates a matrix with 8 rows and 4 cloumns.
# But initially they all are empty(NA).
# These are used to enter the data into the matrix.
# Here c() function is used to concatenate the data.
# In the below example the data is filled by column wise.
my_martix[, 1] <- c(59, 55, 53.5, 55, 52.5, 57.5, 53, 55)
my_martix[, 2] <- c(22.3, 19.7, 20.8, 20.3, 20.8, 21.5,20.6, 21.5)
my_martix[, 3] <- c(31.2, 30.4, 30.6, 30.3, 30.3, 30.8,32.5,34)
my_martix[, 4] <- c(9.5, 13.8, 14.8, 15.2, 15.5, 15.6,15.6, 15.7)
print(my_martix)
[,1] [,2] [,3] [,4]
[1,] 59.0 22.3 31.2 9.5
[2,] 55.0 19.7 30.4 13.8
[3,] 53.5 20.8 30.6 14.8
[4,] 55.0 20.3 30.3 15.2
[5,] 52.5 20.8 30.3 15.5
[6,] 57.5 21.5 30.8 15.6
[7,] 53.0 20.6 32.5 15.6
[8,] 55.0 21.5 34.0 15.7
数据帧(data frame)
数据帧是 R 语言里最常用的数据结构之一。数据是由带有行和列的数据表格表示的。
我们通常在数据帧里读取一个 csv 文件,使用 read.csv() 或 read.table() 函数,然后把 csv 文件的名字作为参数输入函数里来实现的。
我们也可以用 data.frame() 函数来创建一个数据帧。
> df <- data.frame(id = letters[1:5], x = 1:10, y = rnorm(10))
> df
> ## id x y
> ## 1 a 1 -1.37593
> ## 2 b 2 0.47094
> ## 3 c 3 -0.16046
> ## 4 d 4 -1.36914
> ## 5 e 5 0.39763
这里有几个重要的函数,应用到数据帧得出其结构信息等。
因子(factor)
因子是带标签的整数。因子看起来像字符矢量,但实际上是整数,当你把它们当成字符来对待时,需要特别谨慎。一些字符处理方法会强制把因子转换成字符,而其他的字符处理方法会报错。
因子可以用 factor() 函数创建。输入一般是字符矢量。
> x <- factor(c("yes", "no", "no", "yes", "yes"))
> x
[1] yes no no yes yes
Levels: no yes
# table(x) will return a frequency table.
控制结构
以下是控制函数的脚本执行流程的常用结构,包括:
1. if, else
2. for
3. while
4. repeat
5. break
if-else
我们经常需要可以检查一个程序的状态和改变这个程序的行为的功能。条件语句可以提供这样的功能,最简单的形式是 if 语句。
if (condition) {
# do something
} else {
# do something else
}
例子
x <- 1:15
if (sample(x, 1) <= 10) {
print("x is less than 10")
} else {
print("x is greater than 10")
}
for 循环
R 语言里的 for 循环可以在任何列表或矢量中执行。
for (i in 1:5) {
print(i)
}
上述代码是在 R 语言里声明 for 循环的例子,for 循环让循环变量 i 在给定的范围内迭代。
1
2
3
4
5
几种实现 for 循环的方法。
x <- c("apples", "oranges", "bananas", "strawberries")
# Prints the list items with the index.
for (i in x) {
print(x[i])
}
for (i in 1:4) {
print(x[i])
}
for (i in seq(x)) {
print(x[i])
}
# Inline
for (i in 1:4) print(x[i])
[1] NA
[1] NA
[1] NA
[1] NA
[1] "apples"
[1] "oranges"
[1] "bananas"
[1] "strawberries"
[1] "apples"
[1] "oranges"
[1] "bananas"
[1] "strawberries"
[1] "apples"
[1] "oranges"
[1] "bananas"
[1] "strawberries"
while
一个 R 语言里的 while 循环会反复的执行目标语句,只要给定的条件一直是真。不像 for 循环,while 循环不会确定循环次数,而会一直跑直到条件不满足。
while 循环句法
while(condition){
statements
iteration
}
这是一个例子,我们实现一个简单的 while 循环。
i <- 1
while (i < 5) {
print(i)
i <- i + 1
}
1
2
3
4
5
repeat 和 break
一个 repeat 循环是用来反复执行一段代码的,其中没有检查条件然后退出的机制。
repeat 和 break 的句法
repeat{
condition
statements
break
}
现在,让我们用 repeat 和 break 来输出前五个数字。
x <- 1
repeat {
print(x)
x = x+1
if (x == 6){
break
}
}
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
函数
在任何编程语言中函数的主要作用就是可复用性。函数是一系列声明的组合以执行特殊的任务。在 R 语言里有很多内建的函数,例如 sum()、min()、max()、mean() 等。
R 语言中声明函数的句法
function_name <- function(arg_1, arg_2, ...) {
function body
}
现在让我们创建一个函数来输出一系列的数字。
my_function <- function(a) {
for(i in 1:a) {
b <- i^3
print(b)
}
}
# Now call the function supplying 6 as an argument
my_function(6)
216
R 语言里的可视化
数据可视化是对决策至关重要的参考。R 语言为了创建数据储存和可视化儿提供了最好的内置函数和库。
现在,让我们用 R Studio 里的 ggplot2 来创建一个简单的线图,我们需要安装 ggplot2 包,你会在左角找到控制台,执行命令安装包(「package_name」):
> install.packages("ggplot2")
我们现在导入一个内置的数据集(mpg),然后画一个简单的图。
关于 mpg 数据集:这是一个关于燃料经济的数据集,包含了从 1999 年到 2008 年 38 种流行车款的数据。
1. 一个 234 行和 11 个变量的数据帧;
2. displ-发动机排量,以升为单位;
3. hwy-高速公路耗油量,英里每加仑。
library(ggplot2)
# Plots mpg dataset's with Xaxis - displ and Yaxis - hwy
# We can also specify the color pallete by sending the colour argument.
ggplot(mpg, aes(displ, hwy, colour = class)) + geom_point()
原文链接:https://towardsdatascience.com/r-lang-zero-to-hero-c59a9f66841c
本文为机器之心编译,转载请联系本公众号获得授权。