1、 vector格式
vector是一维的数据集合,其数据必须为同一类型,例如都是int型,都是character型。一个原本全是数字组成的vector中一个元素替换为字母时,其余元素也会变为character型。
> a <- 1:6
> str(a)
int[1:6] 1 2 3 4 5 6
> a[1] <- 'a'
> str(a)
chr[1:6] "a" "2" "3" "4" "5""6"
查看vector中元素可以使用x[i]形式,值得注意的是当i超过向量长度时并不会报错,而是返回NA。
> a <- c('a', 'f', 1)
> str(a)
chr[1:3] "a" "f" "1"
> a[9]
[1] NA
同样,使用x[i]进行赋值时,若果i超过向量长度也不会报错,原向量会自动使用NA补足到i的长度。
> a <- c('a', 'f', 1)
> str(a)
chr[1:3] "a" "f" "1"
> a[9] <- 9
> str(a)
chr[1:9] "a" "f" "1" NA NA NA NA NA "9"
vector中的元素可以带题名,可用names函数查看或赋值。
> a <- c('a', 'f', 1)
> names(a)
NULL
> names(a) <- 1:3
> a
1 2 3
"a" "f" "1"
> names(a)
[1] "1" "2""3"
2、 matrix格式
matrix是二维的数据集合,可以看作vector向二维的拓展,也可以看作特殊的array,其数据也必须是同一类型。
matrix(data = NA, nrow = 1, ncol = 1, byrow = FALSE,
dimnames = NULL)
参数:
data 表示新建矩阵中的数据
nrow 行数
ncol 列数
byrow 默认为FALSE,即表示生成矩阵时按列填充,若为TRUE则按行填充
dimnames 行列名,若非空,则须是长度为2的list,分别表示行名和列名
> matrix(1:6, 2, 3)
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
> matrix(1:6, 2, 3, byrow = T)
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
> matrix(1:6, 2, 3, dimnames =list(c('A', 'b'), c('a', 'b', 'c')))
a bc
A 1 3 5
b 2 4 6
转置,使用函数t
> a <- matrix(1:6, 2, 3)
> a
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
> t(a)
[,1] [,2]
[1,] 1 2
[2,] 3 4
[3,] 5 6
合并,函数rbind表示按行合并,cbind表示按列合并。
> a <- matrix(1:4, 2, 2)
> b <- matrix(5:8, 2, 2)
> rbind(a, b)
[,1] [,2]
[1,] 1 3
[2,] 2 4
[3,] 5 7
[4,] 6 8
> cbind(a, b)
[,1] [,2] [,3] [,4]
[1,] 1 3 5 7
[2,] 2 4 6 8
3、 array格式
array可以看作是matrix向高维的拓展,其数据也必须是同一类型。
array(data = NA, dim = length(data), dimnames = NULL)
array的用法基本和matrix一致,只不过matrix中的ncol参数和nrow参数在这里变成了dim参数,dim参数须是一个表示维度的向量。
> array(1:8, c(2, 2, 2),
+ dimnames = list(c('A', 'B'),
+ c('a', 'b'),
+ c(1, 2)))
, , 1
a b
A 1 3
B 2 4
, , 2
a b
A 5 7
B 6 8
array的合并需要加载abind包,使用abind函数。
abind(..., along=N, rev.along=NULL, new.names=NULL,force.array=TRUE,
make.names=use.anon.names, use.anon.names=FALSE,
use.first.dimnames=FALSE, hier.names=FALSE, use.dnns=FALSE)
along 合并array时遵从的维度
rev.along 另一种确定合并维度的方式,along = N + 1 - rev.along
new.names 合并之后新的维度名
force.array 若为TRUE,则合并后的数据类型强行转化为array
> library(abind)
> a <- array(1:8, c(2, 2, 2))
> b <- array(9:16, c(2, 2, 2))
> abind(a, b, along = 1)
, , 1
[,1] [,2]
[1,] 1 3
[2,] 2 4
[3,] 9 11
[4,] 10 12
, , 2
[,1] [,2]
[1,] 5 7
[2,] 6 8
[3,] 13 15
[4,] 14 16
4、 data.frame格式
data.frame是二维数据表,与matrix类似,但是不同列的数据可以属于不同的数据类型。
data.frame(...,row.names = NULL, check.rows = FALSE,
check.names = TRUE, fix.empty.names= TRUE,
stringsAsFactors =default.stringsAsFactors())
参数stringsAsFactors若为TRUE,数据表中的character型数据会自动转化为factor型
生成一个data.frame数据表,可以先生成一个matrix,再使用data.frame或as.data.frame函数将其转化为data.frame格式,也可以使用data.frame函数将几个长度相等的vector组合成一个数据表。
> a <- c('a', 'b', 'c', 'd')
> b <- 1:4
> data.frame(a, b)
a b
1 a 1
2 b 2
3 c 3
4 d 4
> a <- matrix(NA, 2, 2)
> as.data.frame(a)
V1V2
1 NA NA
2 NA NA
data.frame的合并除了可以使用rbind和cbind函数,还可以使用merge函数。
merge(x, y, by =intersect(names(x), names(y)),
by.x = by, by.y = by, all = FALSE, all.x= all, all.y = all,
sort = TRUE, suffixes =c(".x",".y"),
incomparables = NULL, ...)
其中by、by.x、by.y即用于合并的列名。
5、 list格式
list是一个广义的vector,但是其各元素可以是不同的数据结构。
生成一个长度为10的list,可以使用length函数
x <- list(NA)
length(x) <- 10
x
6、 xts格式
xts是常用的时间序列数据格式。一个xts格式的数据由三部分组成,数据索引、数据主体、数据属性。数据索引即xts数据的时间/日期,类似“行名”,可以使用index函数将其提取出来;数据主体即数据的主要部分,类似一个data.frame;数据属性是人为添加的其他属性。
新建一个xts数据,可以使用xts函数。
xts(x = NULL,
order.by = index(x),
frequency = NULL,
unique = TRUE,
tzone = Sys.getenv("TZ"),
...)
order.by须是一个Date型数据。
> a
date open high close low volume total_pay
1 1991-04-03 988.05 988.05 988.05988.05 100 10000
2 1991-04-04 983.11 983.11 983.11983.11 52300 761000
3 1991-04-05 978.27 978.27 978.27978.27 10700 150000
4 1991-04-08 968.57 968.57 968.57968.57 5700 84000
5 1991-04-09 963.73 963.73 963.73963.73 1900 39000
6 1991-04-10 958.88 958.88 958.88958.88 4500 110000
> b <- xts(x = a[, 2:7], order.by =as.Date(a[, 1]))
> b
open high close low volume total_pay
1991-04-03 988.05 988.05 988.05 988.05 100 10000
1991-04-04 983.11 983.11 983.11 983.11 52300 761000
1991-04-05 978.27 978.27 978.27 978.27 10700 150000
1991-04-08 968.57 968.57 968.57 968.57 5700 84000
1991-04-09 963.73 963.73 963.73 963.73 1900 39000
1991-04-10 958.88 958.88 958.88 958.88 4500 110000
xts类型数据对于时间的检索十分方便,通过x[“相应日期”]的格式即可完成。
> b['1991-04-05']
open high close low volume total_pay
1991-04-05 978.27 978.27 978.27 978.27 10700 150000
某段时期内
> b['19910405/19910409']
open high close low volume total_pay
1991-04-05 978.27 978.27 978.27 978.27 10700 150000
1991-04-08 968.57 968.57 968.57 968.57 5700 84000
1991-04-09 963.73 963.73 963.73 963.73 1900 39000
> b['/19910405']
open high close low volume total_pay
1991-04-03 988.05 988.05 988.05 988.05 100 10000
1991-04-04 983.11 983.11 983.11 983.11 52300 761000
1991-04-05 978.27 978.27 978.27 978.27 10700 150000
xts数据集合并也可以使用cbind和rbind函数,若两个时间跨度不同的xts数据使用cbind合并,则会生成一个包含两个时间段所有时间的新序列,缺失值会自动用NA填充。
> a
daily.returns
2005-04-08 0.00000000
2005-04-11 0.02209131
2005-04-12 -0.04322767
2005-04-13 0.03614458
2005-04-14 -0.04069767
> b
daily.returns
2005-04-12 -0.002463054
2005-04-13 0.012345679
2005-04-14 -0.034146341
2005-04-15 -0.027777778
2005-04-18 -0.023376623
2005-04-19 0.000000000
> cbind(a, b)
daily.returns daily.returns.1
2005-04-08 0.00000000 NA
2005-04-11 0.02209131 NA
2005-04-12 -0.04322767 -0.002463054
2005-04-13 0.03614458 0.012345679
2005-04-14 -0.04069767 -0.034146341
2005-04-15 NA -0.027777778
2005-04-18 NA -0.023376623
2005-04-19 NA 0.000000000