R语言:常用数据格式及其操作

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_40628687/article/details/79331374

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

猜你喜欢

转载自blog.csdn.net/weixin_40628687/article/details/79331374