R语言主要用于数据可视化与统计分析,当然现在也可以通过扩展包实现数据挖掘等算法。与Python相比,R语言相当于天生就加载了NumPy,SciPy,Pandas的大多数功能。现在来介绍一些R语言的基本知识。
1, 包
(1)下载包
install.packages(
c("xts", "zoo"),
lib = "some/other/folder/to/install/to", # 用lib参数来改变包安装的地址
repos = "http://www.stats.bris.ac.uk/R/“ # 指定下载包的源
)
(2)加载包
library和require都可以载入包,但二者存在区别。
在一个函数中,如果一个包不存在,执行到library将会停止执行,require则会继续执行。
如下面的例子,require会返回 TRUE / FALSE
d = require(ggplot2)
d
[1] TRUE
如果需要加载的多个包可以用下面循环
pkgs <- c("lattice", "utils", "rpart")
for(pkg in pkgs)
{
library(pkg, character.only = TRUE)
}
3,查看变量的类型
4,常用其他系统函数
5,查看R的源代码,
例如:
methods(AIC)
[1] AIC.default* AIC.logLik*
getAnywhere(AIC.default)
R语言的数据对象从结构角度划分,可以分为向量、数组、矩阵、因子、列表和数据框六种。
其中,
(1)定义
向量的元素可以是数值型、字符型、逻辑值型和复数型,甚至列表型。向量中可以包含一个元素,也可以包含多个元素。同一个向量中的数据类型应该相同。
R中的向量是连续存储的,因此不能插入或删除元素。如想添加删除元素,需要重新给向量赋值。
(2)快速创建向量
c(1, 1:3, c(5, 8), 13) #values concatenated into single vector
[1] 1 1 2 3 5 8 13
(3)建立空向量
vector("numeric", 5) 或 numeric(5)
## [1] 0 0 0 0 0
vector("complex", 5) 或 complex(5)
## [1] 0+0i 0+0i 0+0i 0+0i 0+0i
vector("logical", 5) 或 logical(5)
## [1] FALSE FALSE FALSE FALSE FALSE
vector("character", 5) 或 character(5)
## [1] "" "" "" "" ""
vector("list", 5)
## [[1]]
## NULL
##
## [[2]]
## NULL
##
## [[3]]
## NULL
##
## [[4]]
## NULL
##
## [[5]]
## NULL
(4)运用序列函数seq创建向量
seq(from = 1, to = 5, by =1)
seq_len(5)
NULL 1 2 3 4 5
seq_alone() 创建从1到输入的向量的长度
pp <- c("Peter", "Piper", "picked", "a", "peck", "of", "pickled", "peppers”)
for(i in seq_along(pp)) print(pp[i]) # 等价于 for(i in pp) print(i)
## [1] "Peter"
## [1] "Piper"
## [1] "picked"
## [1] "a"
## [1] "peck"
## [1] "of"
## [1] "pickled"
## [1] "peppers"
(5)向量的属性与方法
2,字符串与因子
因子属于字符型向量的一种,在dataframe中,分类变量会默认的转换成因子类型。
例子,
heights <- data.frame(
height_cm = c(153, 181, 150, 172, 165, 149, 174, 169, 198, 163),
gender = c(
"female", "male", "female", "male", "male",
"female", "female", "male", "male", "female"
)
)
class(heights$gender)
[1] "factor"
(3)因子相关的属性与函数
3,矩阵与数组
向量是一维度的,数组是多维度的,矩阵是二维的数组,是数组中的特例。
向量中的数据类型是必须是相同的,而对于列表list,值可以是不同类型的,可以复杂的嵌套所有数据结构。
data frame之于matrix,就像list之于vector,像是一个升级版,可以存储多种类型的数据(即每一列的数据类型可以不同)
并且data frame 会自动把strings的数据自动转换成factors, 如不想,则额外规定属性
“stringsAsFactors=FALSE”
数据框是二维的列表,并且每列表示一个不同的非嵌套的列表,每列长度需要相同。
(1)创建list 列表
列表中,可以是向量、日期、矩阵、三角函数等等,长度可以不一致
a_list <- list(
c(1, 1, 2, 5, 14, 42),
month.abb,
matrix(c(3, -8, 1, -3), nrow = 2),
asin
)
(2)创建数据框
data.frame(
x = letters[1:5],
y = y,
z = runif(5) > 0.5, row.names = NULL
)
(3)列表与矩阵的属性与方法
1,环境
所有的变量创建出来后,都需要存在一个地方,这个地方就是环境。环境本身也像变量一样可以被操作,赋值到函数中。环境有一点想list列表一样,可以储存任何值,甚至环境与list是可以相互转换的。
R的环境系统实质上是存储在RAM内存中,并且R环境之间的关系并不是嵌套关系。而是更接近树形结构,每一个环境都与一个父环境相连,但这样的连结是单向的:我们可以很轻松的找到某个环境的父环境,却难以直接找到一个环境的子环境。因此R环境的树形结构不支持自上而下的搜索。
实际应用中,环境都是会自动创建的。此处讲解环境有助于我们对后续开发的理解,并且理解环境的作用域也是非常重要的。
2,函数
(1)格式
R语言中的函数定义是很宽松的
function(x) {
5*x
}
或
function(x) 5*x # 放进一行写代码的时候,可以不用花括号
(2)无 return
在R语言中个,自定义的函数是不用写return的,系统会自动返回算出来的结果。
(3) 参数
函数的参数,一般不指定具体值,不过根据需要也可以指定值,并且可以配合一些默认的函数。
例子:
hypotenuse <- function(x=3, y=mean(x)) {
sqrt(x ^ 2 + y ^ 2)
}
(4)function相关的方法
1,条件判断
(1)if else
If(){
## do something
} else if(){
## do something
} else {
## do something
}
例子:
if(TRUE) message("It was true!")
## It was true!
(2)向量化ifelse():
2,循环
R语言中循环涉及到了三个主要函数 repeat, while, for。不过基于R语言向量化的思想,应该降低循环的适用。
(1)repeat
repeat会不断循环重复执行,知道遇到 break。所以repeat一般不会单独使用,要结合 next,break使用。
例子:
repeat
{
message(“Happy Groundhog Day!”)
action <- sample(
c(
“Learn French”,
“Make an ice statue”,
“Rob a bank”,
“Win heart of Andie McDowell”
), 1)
if(action == “Rob a bank”) {
message(“Quietly skipping to the next iteration”)
next
}
message("action = ", action)
if(action == “Win heart of Andie McDowell”) break
}
(2)while
while与repeat很像,不过是先判断是否要执行,然后再循环。
例子:
action <- sample(
c(
"Learn French",
"Make an ice statue",
"Rob a bank",
"Win heart of Andie McDowell"
),
1
)
while(action != "Win heart of Andie McDowell") {
message("Happy Groundhog Day!")
action <- sample(
c(
"Learn French",
"Make an ice statue",
"Rob a bank",
"Win heart of Andie McDowell"
),
1
)
message("action = ", action)
}
用到for的时候,一般是知道要循环几次或循环的范围的。
并且,for循环不局限于数字,还可以是字符型向量,逻辑型向量,列表。
例子:
x<- c(“a”,“b”,“c”,“d”)
for (i in 1:13) {
print x[i]
}
for (letter in x) {
print (letter)
}
(4)for + get()
对非向量集合的循环,运用get(), 获取对应名称的变量值
例子:
下面的 u,v 分别是两个不同的矩阵
3, 高级循环-向量化
2,保存数据