R语言系列:1 编程基础💎2 循环语句💎3 向量、矩阵和数组
前面介绍了向量、矩阵和数组这三种数据结构,它们在数学计算方面便捷而强大。接下来介绍两种更有R风格的数据结构,即列表和数据表,这五种数据类型的差异如下
从外观上看,列表和向量是极为相似的,但二者的内在并不同,向量中的内容必须有着相同的数据类型,但列表并不需要。为了说明这种区别,可以在命令行中分别创建两个变量
> vec = c(1,'2')
> lst = list(1,'2')
> print(lst)
[[1]]
[1] 1[[2]]
[1] "2"
> print(vec)
[1] "1" "2"
也就是说,向量自动将1
转化为了"1"
,从而和"2"
保持相同的数据类型,但list
并不需要,而且可以更加方便地进行添加、删除元素等操作,如下例所示
> lst[3] <- "3"
> print(lst)
[[1]]
[1] 1[[2]]
[1] "2"[[3]]
[1] "3"> lst[3] <- NULL
> lst
[[1]]
[1] 1[[2]]
[1] "2"
那么, 代价是什么?
代价就是列表没法像向量那样自由地进行计算。
数据帧是通过data.frame()
创建的数据结构,有的时候也称之为数据框,简单地理解就是二维列表,其创建函数为
data.frame(vecs, row.names = NULL, check.rows = FALSE,check.names = TRUE, fix.empty.names = TRUE,stringsAsFactors = default.stringsAsFactors())
其中,vecs
是多组列向量,是创建数据框必不可少的要素,
row.names
为行名check.rows
为TRUE
时,会检测行的名称和长度是否一致check.names
为TRUE
时,检测数据框的变量名是否合法fix.empty.names
为TRUE
时,未命名的参数自动设置名stringsAsFactors
为TRUE
时,字符自动转换为因子示例如下
table = data.frame(姓名 = c("张三", "李四"),工号 = c("001","002"),月薪 = c(1000, 2000))
print(table)
输出结果为
姓名 工号 月薪
1 张三 001 1000
2 李四 002 2000
其索引方式比较灵活,既可以通过行号、列号,也可以直接通过列名
> print(table[1])姓名
1 张三
2 李四
> print(table["姓名"])姓名
1 张三
2 李四
> print(table[,1])
[1] "张三" "李四"
通过符号$
可以更加便捷地根据列名来提取某一列,以及增添或删除某一列,其逻辑与列表相同
> table$姓名
[1] "张三" "李四"
> table$姓名 <- NULL #
> table工号 月薪
1 001 1000
2 002 2000
> table$姓名 <- c("张三", "李四")
> table工号 月薪 姓名
1 001 1000 张三
2 002 2000 李四
数据帧可以通过表头来索引,这一点列表、向量等数据结构同样可以做到。其中,列表通过names
函数来实现
lst <- list(c("hello","R","language"), c(1,2,3,4,5,6),list("hello",3.14))names(lst) <- c("Sites", "Numbers", "Lists")
然后就可以使用$
来索引了
> lst$Sites
[1] "hello" "R" "language"
向量也可以通过names
来进行命名,但不支持$
索引
> vec <- c(1,2,3)
> names(vec) <- c("a","b","c")
> vec
a b c
1 2 3
矩阵可通过colnames
和rownames
分别进行行和列的命名
> m1 = matrix(1:12, 3, 4)
> rownames(m1)<-c("r1","r2","r3")
> colnames(m1)<-c("c1","c2","c3","c4")
> m1c1 c2 c3 c4
r1 1 4 7 10
r2 2 5 8 11
r3 3 6 9 12