程序员

学习R记录 <- 基础4(列表与数据框)

2019-03-25  本文已影响7人  limbo1996

列表与数据框
到目前为止,向量、数组、矩阵这些前面提到的所包含的元素类型都是相同的,而列表数据框允许把不同的数据类型合并到单一变量中。

1.列表

1.1 创建列表

创建列表使用list函数,列表中的元素类型不限,可以是向量、矩阵,甚至还可以是函数。

> a <- list(
+   c(1,2,3,4,5),
+   month.abb,
+   matrix(c(3, -8, 1, -3), nrow = 2),
+   asin
+ )
> a
[[1]]
[1] 1 2 3 4 5

[[2]]
 [1] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec"

[[3]]
     [,1] [,2]
[1,]    3    1
[2,]   -8   -3

[[4]]
function (x)  .Primitive("asin")

同样的,你也可以给列表命名。

> names(a) <- c('catalan', 'months', 'involutary', 'arcsin') 
> a
$catalan
[1] 1 2 3 4 5

$months
 [1] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec"

$involutary
     [,1] [,2]
[1,]    3    1
[2,]   -8   -3

$arcsin
function (x)  .Primitive("asin")

同样你也可以把此列表当作另一个列表的元素。

1.2 原子变量和递归变量

这里有一个概念:因为列表有把其他列表包含在内的能力,所以被称为递归变量, 与之相对的向量、矩阵、数组被称为原子变量

1.3 索引列表

我们可以使用[]、正负下标数或者元素名称,逻辑索引来访问列表元素,
值得注意的是,索引操作的结果产生了另一个列表, 所以当你要访问列表元素的内容,需要使用[[]]双方括号

> a
[[1]]
[1] 1 2 3 4 5

[[2]]
[1]  6  7  8  9 10

[[3]]
[1] "dsa"

> a[1]
[[1]]
[1] 1 2 3 4 5

> a[[1]]
[1] 1 2 3 4 5

使用函数is.list会更直观:

> a[[1]]
[1] 1 2 3 4 5
> is.list(a)
[1] TRUE
> is.list(a[1])
[1] TRUE
> is.list(a[[1]])
[1] FALSE

当然对于已经命名的元素可以使用$来访问其值。这就有点类似于shell了。

1.4 向量与列表的转换

> b <- c(1,2,3,4)
> c <- as.list(b)
> b
[1] 1 2 3 4
> c
[[1]]
[1] 1

[[2]]
[1] 2

[[3]]
[1] 3

[[4]]
[1] 4

> is.list(c)
[1] TRUE

如上,使用函数as.list可以完成转化。
当然列表也可以转化成向量

1.5NULL值

NULL值是一个特殊值,它表示的是一个空的变量,有时候你创建一个列表时,有的元素必须存在但是目前还没有赋值,就可以用NULL来表示。
需要区分的是NULL和NA它们有很大区别,其中一个区别就是NULL的长度为0——NULL不会占用任何空间;而NA是一个标量,长度为1

> length(NULL)
[1] 0
> length(NA)
[1] 1

2. 数据框

数据框十分常见,它就类似于一个电子表格。

2.1 创建数据框

使用函数data.frame可以创建数据框:

> c <- data.frame(x = c(1:5), y = rnorm(5), z = runif(5) > 0.5)
> c
  x          y     z
1 1 -0.8818198  TRUE
2 2  1.1158819  TRUE
3 3  0.4585993  TRUE
4 4  0.8917424 FALSE
5 5  0.7377649  TRUE

在数据框中每一列的数据类型必须相同,但是列与列之间类型可以不同。
每一行的名字可以使用参数row.names来命名

> row.names(c) <- c('A', 'B', 'C', 'D', 'E')
> c
  x           y     z
A 1 -1.00220443 FALSE
B 2 -0.81289684  TRUE
C 3 -0.79172877 FALSE
D 4  0.19666573  TRUE
E 5 -0.04511619 FALSE

其实几乎所有的矩阵的函数都可以用在数据框上

> rownames(c)
[1] "A" "B" "C" "D" "E"
> colnames(c)
[1] "x" "y" "z"
> dimnames(c)
[[1]]
[1] "A" "B" "C" "D" "E"

[[2]]
[1] "x" "y" "z"

> nrow(c)
[1] 5
> ncol(c)
[1] 3
> dim(c)
[1] 5 3
> length(c)
[1] 3
> names(c)
[1] "x" "y" "z"

有点不同的是函数length返回和函数ncol一样的值即列数,names函数返回的也是列名。

上一篇 下一篇

猜你喜欢

热点阅读