列表与数据框
到目前为止,向量、数组、矩阵这些前面提到的所包含的元素类型都是相同的,而列表和数据框允许把不同的数据类型合并到单一变量中。
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可以完成转化。
当然列表也可以转化成向量
- 当列表中元素都是标量时,使用函数as.numeric等可以将列表转换为不同类型的向量。
- 当列表中的元素包含非标量, 那这就是一个问题了,可以先使用函数unlist将其转化为向量
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函数返回的也是列名。
网友评论