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."
> 

除了ifelse,还有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
> 

 

此外,whilerepeat也是类似的循环,不难学,读者可以去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语言最常用的基本语法了