R语言的基本语法不复杂,远远不像Ruby那样一个东西有各种写法,所以学起来很快,写R语言最重要的一点就是,脑子里一定要有向量、矩阵、列表这样的概念。
额外说一句,我听过一句话,判断一个人聪不聪明,就是看他有没有能力把复杂的问题拆散成小部分,然后逐个去完成,最后把整个问题综合起来解决。这句话很适合编程,无论需要写多大的程序,你都只需要把那个问题分散出来,分成一个部分,一个循环,一个判断,一个读取,一个输出……然后一步一步,像乐高积木一样去解决这个问题。
首先介绍一下R语言中的数据结构,主要有Vector, List, matrix, DataFrame, Array, Facter。其中最常用的有DaraFrame, matrix, list, vecter. 个人不太推荐factor,因为factor在做计算的时候,经常会需要做character转换,而如果你忘记做转换了,程序依然会运行,但是结果是错的,因为factor会自动编程某一个数字。
以下部分内容摘自w3cschool.
Vectors 向量
当你想用多个元素创建向量时,你应该使用c()函数,这意味着将元素组合成一个向量。简而言之,向量就是一系列相同属性
的元素的集合。
Vector对应的一个循环函数是sapply,简直就是神器……
# Create a vector.
apple <- c('red','green',"yellow")
print(apple)
# Get the class of the vector.
print(class(apple))
# 当我们执行上面的代码,它产生以下结果
[1] "red" "green" "yellow"
[1] "character"
Lists 列表
列表是一个R对象,它可以在其中包含许多不同类型的元素,如向量,函数甚至其中的另一个列表。列表非常好用,你可以再一个列表中包含一系列东西,我经常用它构建多维数组(可能不是最好的办法),再加上lapply函数,非常好用。
# Create a list.
list1 <- list(c(2,5,3),21.3,sin)
# Print the list.
print(list1)
[[1]]
[1] 2 5 3
[[2]]
[1] 21.3
[[3]]
function (x) .Primitive("sin")
Matrices 矩阵
矩阵是二维矩形数据集。 它可以使用矩阵函数的向量输入创建。矩阵运算是R胜过其他大部分编程语言的优势,所以矩阵是很常见的一种格式。有时候,人们会分不清矩阵和DataFrame,感觉用起来差不多,但实际上DataFrame应该用来存储数据,而Matrix更适合单纯的运算分析。换言之,最好矩阵中的所有数值,都是一类的元素。不要列与列之间是不同的东西。 Matrix对应的快捷循环函数是apply(),其中你设置第二个参数就可以决定是按行apply还是按列apply。
# Create a matrix.
M = matrix( c('a','a','b','c','b','a'), nrow = 2, ncol = 3, byrow = TRUE)
print(M)
当我们执行上面的代码,它产生以下结果
[,1] [,2] [,3]
[1,] "a" "a" "b"
[2,] "c" "b" "a"
Arrays 数组
虽然矩阵被限制为二维,但阵列可以具有任何数量的维度。 数组函数使用一个dim属性创建所需的维数。 在下面的例子中,我们创建了一个包含两个元素的数组,每个元素为3x3个矩阵。个人不太用这个东西,因为维度太多容易搞得自己也头晕……
# Create an array.
a <- array(c('green','yellow'),dim = c(3,3,2))
print(a)
当我们执行上面的代码,它产生以下结果
, , 1
[,1] [,2] [,3]
[1,] "green" "yellow" "green"
[2,] "yellow" "green" "yellow"
[3,] "green" "yellow" "green"
, , 2
[,1] [,2] [,3]
[1,] "yellow" "green" "yellow"
[2,] "green" "yellow" "green"
[3,] "yellow" "green" "yellow"
Factors 因子
因子是使用向量创建的r对象。 它将向量与向量中元素的不同值一起存储为标签。 标签总是字符,不管它在输入向量中是数字还是字符或布尔等。 它们在统计建模中非常有用。
使用factor()函数创建因子。nlevels函数给出级别计数。
factor最大的问题就是,经常和character分不清,导致用起来计算出错。所以用的时候要非常小心。
# Create a vector.
apple_colors <- c('green','green','yellow','red','red','red','green')
# Create a factor object.
factor_apple <- factor(apple_colors)
# Print the factor.
print(factor_apple)
print(nlevels(factor_apple))
当我们执行上面的代码,它产生以下结果
[1] green green yellow red red red yellow green
Levels: green red yellow
# applying the nlevels function we can know the number of distinct values
[1] 3
Data Frames 数据框
数据框是表格数据对象。 与数据框中的矩阵不同,每列可以包含不同的数据模式。 第一列可以是数字,而第二列可以是字符,第三列可以是逻辑的。 它是等长度的向量的列表。
使用data.frame()函数创建数据框。数据框是一种非常实用的结构,几乎大部分的excel文件,csv文件,导入R以后都是数据库。在你载入数据之后,记得要查一下,每一列DataFrame的列是什么格式。
# Create the data frame.
BMI <- data.frame(
gender = c("Male", "Male","Female"),
height = c(152, 171.5, 165),
weight = c(81,93, 78),
Age = c(42,38,26)
)
print(BMI)
当我们执行上面的代码,它产生以下结果
gender height weight Age
1 Male 152.0 81 42
2 Male 171.5 93 38
3 Female 165.0 78 26
变量操作
介绍一下如何操作变量,简单来说就是如何创建,删除,查找变量,以及变量之间的转换。
创建变量的方法一般都是直接使用“<”赋值,“=”其实也能用,但是不推荐,因为<能看得更清楚,=号再很多地方都能用。
> A <- c(1,2,3)
> B <- list(1,2,3)
> C <- matrix(1:20,nrow=4,ncol=5)
> D <- data.frame(A=c(1,2,3),B=c("a","b","c"))
至于如何寻找变量,使用ls()
命令就可以,这个命令可以列出所有的变量:
> ls()
[1] "A" "B" "C" "D"
删除变量使用的方法就是rm()
,
> rm(B)
> ls()
[1] "A" "C" "D"
通过class()
函数可以查看某一个变量的类型:
> class(A)
[1] "numeric"
> class(C)
[1] "matrix"
> class(D)
[1] "data.frame"
>
其中numeric的意思就是,这个变量是数字类型,如果是字符串,会显示是”character”,再分析过程中,记得经常查看变量的类型。
另外值得一提的是,有时候,你需要建立一个空变量,然后再循环中去给这个变量添加东西,那种时候,应该用的命令是:
A <- vector()
B <- list()
这些都是很常用的命令。
判断
个人觉得,学一门语言,学懂了定义变量,判断、循环,读取文件、写入文件就已经差不多掌握了80%了……一个人计算机水平高低,不在于知道多少语言,而在于他的if else for写的有多精妙。
判断的意思很简单,如果来了两个数值,1和2,1的时候,完成A操作,2的时候完成B操作,你就写一个判断,判断这两个数值的值,然后进行相应的操作。
R语言的判断这么写:
A <- 1
if(A == 1) {
print("A is 1.")
} else {
print("A is not 1.")
}
在交互框写的时候,会出现+号,提示你正在写同一个大括号内的内容:
> A <- 1
> if(A == 1) {
+ print("A is 1.")
+ } else {
+ print("A is not 1.")
+ }
[1] "A is 1."
>
除了if
和else
,还有else if
用于多情况判断。值得注意的地方有:
1:else 必须放在最后,写在上一个右括号“}”的同一行。
2:else if可以无限多。
3:if里边的交并多重判断连接符用&
或者|
,只有一个符号不是两个。
4: if可以缩写:if(A==1) print(“A is 1”) else print(A is not 1”“)。
5:如果if下只有一行语句,可以不写大括号。
另外还有swich语句也可以用于判断,那种情况就是,你输入的一个数值只有集中可能性,每一种可能性都会有一个操作:
x <- switch(
3,
"first",
"second",
"third",
"fourth"
)
print(x)
当上面的代码被编译和执行时,它产生以下结果 -
[1] "third"
循环
循环可谓是IT行业的基石。没有循环,就不可能存在计算机这个行当,乃至于整个IT行业都不复存在。循环的最大价值就是,让程序可以重复性的工作,这个简直太重要了,除了极少数人,社会上大部分的人其实都是在做重复性操作,种植、养殖、富士康工厂、乃至会计、审计……。
R语言的循环有很多种写法,我一般只用两种:apply系列函数
和for
,先介绍for:
v <- LETTERS[1:4]
for ( i in v) {
print(i)
}
for的写法很简单,一般来说,for后边的一个括号里,包含了你要检索的一个vector,或者列表。就是说,你可以用命令i in c(1:10)
,来访问1到10所有数字,也可以用命令i in list(A=XX,B=XX,C=XX...)
来访问一个非常复杂的列表。所以写的时候,脑子要清晰,你传入的参数是什么很关键。
再循环中,如果你要跳过该此循环,继续跑循环,你应该用next
命令行,这类似于有些语言里的continue
,如果要跳出循环,应该用break
。
举例如下:
> A <- 3
> B <- 8
> for(i in 1:10){
+ if(i == A) next
+ if(i == B) break
+ print(i)
+ }
[1] 1
[1] 2
[1] 4
[1] 5
[1] 6
[1] 7
>
此外,while和repeat也是类似的循环,不难学,读者可以去w3cschool去学习一下。
Apply
这里值得一说的东西是Apply,这个函数真是R语言里我最喜欢的几个函数之一,(aggregate
是另一个我很喜欢)。Apply可以非常简单漂亮地写出循环,无论是对于vector, list, 还是dataframe, matrix都有很好的支持。
假如你有一个向量vector,想要对其中的每一个元素做一些操作,你就可以用这个办法:
> sapply(c(1:10),function(x) x^2)
[1] 1 4 9 16 25 36 49 64 81 100
>
再上述代码中,我将向量c(1:10)传入了sapply中,然后再之后,定义了一个function(x), 其中x就是每一个c(1:10)中的元素,1,2,3,4…一直到10,然后针对每一个x,进行平方操作。这样一次性就可以计算出所有结果。
对于list,有对应的lapply
函数,操作也是一样的,定义一个function,然后再function中针对每一个传入的元素做一些操作。
对于dataframe或者matrix,你可以定义想要按行操作还是按列操作。
> A <- matrix(1:20,nrow=4,ncol=5)
> A
[,1] [,2] [,3] [,4] [,5]
[1,] 1 5 9 13 17
[2,] 2 6 10 14 18
[3,] 3 7 11 15 19
[4,] 4 8 12 16 20
> apply(A,1,function(x) mean(x))
[1] 9 10 11 12
> apply(A,2,function(x) mean(x))
[1] 2.5 6.5 10.5 14.5 18.5
>
在上述代码中,我定义了一个matrix矩阵,然后先后按行和按列求取其均值,唯一的差别就是,再使用apply函数的时候,第二个参数1和2决定了是按行还是按列操作。
基本上我觉得,上述就是写R语言最常用的基本语法了