![d569046ae33a463acadf604ac6505815.png](https://i-blog.csdnimg.cn/blog_migrate/b901dfdd8d2eee3f431fe36c43f0ae2d.jpeg)
R中的数据类型与存储方式以原子型向量为基础,通过改变其对应属性可以生成矩阵、列表和数据框等数据容器。下面将从原子型向量开始,揭示各个数据容器之间的内在联系,帮助大家更好地理解与使用R来存储与分析数据。
目录
1. 原子型向量
2. 向量类型转换
3. 属性attribute
4. 日期和时间
5. 因子factor
6. 矩阵matrix
7. 数组array
8. 列表list
9. 数据框dataframe
小结
1. 原子型向量
原子型向量就是最简单的包含数据的向量,在R中以下均是原子型向量:
x <- 1
y <- 1:6
z <- c(1,2,3,4,5,6)
原子型向量仅保存类型相同的数据, 如果将数字与字符混合,R会将任何数值的类型转换为字符。运算符c()
用于创建存储数字、字符或布尔值的向量。其中c代表连接(concatenate),也可理解为收集(collect)或者合并(combine)。
first_vector <- c(1,2,3,4,5,6)
second_vector <- c('a', 'b', 'c','d')
third_vector <- c('a', 1, 2, 3)
# 向量合并
new_vector <- c(first_vector,second_vector)
new_vector
## [1] "1" "2" "3" "4" "5" "6" "a" "b" "c" "d"
判断某个对象是否为原子型向量:
is.vector(x)
## TRUE
R中的原子型向量可以存储以下6中数据类型:双整型(double),整型(integer),字符型(character),逻辑型(logical),复数类型(complex),原始类型(raw)
1.1 双整型
R中数值的默认以双整型(double)存储,也可以将双整型称为数值型(numeric)。
z <- c(1,2,3,4,5,6)
class(z)
## [1] "numeric"
typeof(z)
## [1] "double"
1.2 整型
整型用来存储整数数据,整形数据也可以被存储为双整型。在R中,设定整型的方法是在数值之后加上L
,否则数值将被默认存储为双整型。
int <- c(1L, 2L, 3L)
class(int)
## [1] "integer"
typeof(int)
## [1] "integer"
1.3 字符型
字符型向量存储文本数据,在R中,字符类型需要加引号。
text <- c("Hello", "World")
typeof(text)
## [1] "character"
class(text)
## [1] "character"
1.4 逻辑型
逻辑型向量用来存储TRUE(真)和FALSE(假),R也会默认把T和F分别当做TRUE和FALSE的简写。
logic <- c(TRUE, FALSE, TRUE)
typeof(logic)
## [1] "logical"
class(logic)
## [1] "logical"
1.5 复数类型
复数类型用来存储复数。
# 注意虚部即使为1也要添加上去
comp <- c(1+1i, 2+2i, 1+3i)
typeof(comp)
## [1] "complex"
class(comp)
## [1] "complex"
1.6 原始类型
原始类型用来存储数据的原始字节。
# 生成长度为3的原始类型向量
raw(3)
## [1] 00 00 00
typeof(raw(3))
## [1] "raw"
class(raw(3))
## [1] "raw"
2. 向量类型转换
R中通过强制转换数据类型使得向量中仅存储单一类型的数据:如果一个原子型向量包含字符串,R会将该向量中的所有元素都转换成字符型;如果一个原子型向量包含逻辑型和数值型元素,R会将逻辑型全部转换成数值型(所有的TRUE值都将被转换成1,所有的FALSE值都将被转换成0)。
对逻辑型向量进行运算,R也会应用上述转换规则:
sum(c(TRUE,FALSE,TRUE,FALSE))
## [1] 2
mean(c(TRUE,FALSE,TRUE,FALSE))
## [1] 0.5
其中, sum
函数相当于是在计算向量包含多少个TRUE值,而mean
函数则计算TRUE值在向量中所占的比例。
通过as
系列函数可以实现数据类型的转换:
as.character(1)
## [1] "1"
as.logical(1)
## [1] TRUE
as.numeric(FALSE)
## [1] 0
3. 属性attribute
属性是附加给原子型向量的额外信息,一个原子型向量最常见的三种属性是:名称(name),维度(dim)和类(class)。查看所有属性信息:
attributes(1:6)
## NULL
3.1 名称
添加名称属性:使用names
函数将一串与原子型向量等长的向量赋给原子型向量作为它的名称属性值。
vec <- 1:6
names(vec) <- c("one", "two", "three",'four', "five", "six")
查询名称属性值:
vec
## one two three four five six
## 1 2 3 4 5 6
names(vec)
## [1] "one" "two" "three" "four" "five" "six"
attributes(vec)
## $names
## [1] "one" "two" "three" "four" "five" "six"
修改名称属性与创建名称属性的方法相同,删除名称属性只需要将NULL
值赋给names
函数即可。
3.2 维度
原子型向量可以通过添加维度属性的方式转换为二维矩阵(matrix)或者多维数组(array)。在分配维度属性时,R始终将第一个值赋给行数,将第二个值副给列数。
将vec向量组织成一个2行3列的矩阵:
dim(vec) <- c(2,3)
class(vec)
## [1] "matrix"
vec
## [,1] [,2] [,3]
## [1,] 1 3 5
## [2,] 2 4 6
将vec向量重新组织成一个1行2列和3个切片的三维数据结构:
dim(vec) <- c(1,2,3)
class(vec)
## [1] "array"
vec
## , , 1
## [,1] [,2]
## [1,] 1 2
## , , 2
## [,1] [,2]
## [1,] 3 4
## , , 3
## [,1] [,2]
## [1,] 5 6
3.3 类
通过上面的例子可以发现,类是原子型向量的一个特例,例如,矩阵vec其实是一个特殊的(dim属性为c(2,3)
, class属性为matrix
)整型向量。当改变vec的维度时,R就为其新添了一个class属性。在运行attributes
函数时,对象的class属性并非总是会显示。
4. 日期和时间
日期和时间型在R中本质上是一种特殊(class属性为"POSIXct"与"POSIXt" )的双整型。POSIXct是一个被广泛用于表示日期与时间的框架,在POSIXct框架下,时间被表示为自1970年1月1日零点(UTC时间)开始所逝去的秒数。
# 返回计算机当前时间
now <- Sys.time()
now
## [1] "2020-01-14 11:57:48 CST"
typeof(now)
## [1] "double"
class(now)
## [1] "POSIXct" "POSIXt"
查看日期与时间类型对应的具体数值:
unclass(now)
## [1] 1578974268
计算1970年1月1日零点之后的100万秒对应的时间:
seconds <- 10^6
class(seconds) <- c("POSIXct","POSIXt")
seconds
## [1] "1970-01-12 21:46:40 CST"
5. 因子factor
因子用来存储R中的分类信息,向factor
函数传递一个原子型向量即可生成一个因子。R会将向量中的值重新编码为一串整数值,再将编码的结果存储在一个整型向量中。此外,R还会将levels属性和class属性添加到该整形向量,其中levels属性包含因子值的一组标签,而class属性为factor。
gender <- factor(c("male", "female", "female", "male"))
typeof(gender)
## [1] "integer"
attributes(gender)
## $levels
## [1] "female" "male"
## $class
## [1] "factor"
查看因子的存储方式:
unclass(gender)
## [1] 2 1 1 2
## attr(,"levels")
## [1] "female" "male"
将因子强制转换为字符串
as.character(gender)
## [1] "male" "female" "female" "male"
6. 矩阵matrix
矩阵是二维数据结构, 使用matrix
函数创建矩阵与直接对原子型向量添加维度效果类似,可以通过byrow
参数控制矩阵是先排满行还是先排满列:
# 按列排列
mat1 <- matrix(c(1,2,3,4,5,6),
nrow=2, ncol=3)
# 按行排列
mat2 <- matrix(c(1,2,3,4,5,6),
nrow=2, ncol=3, byrow=TRUE)
7. 数组array
数组是三维及以上的数据结构, 使用array
函数创建矩阵与直接对原子型向量添加维度效果类似。注意到如果传入的dim
参数设置为二维,则其class属性为matrix
:
ar <- array(vec, dim = c(1,2,3))
8. 列表list
列表可以将不同类型的对象组织在一个一维集合中,与原子型向量不同的是,列表并不是将某些具体的值组织起来,而是组织R对象。列表的结构可以变得非常复杂,是R中全能型的存储工具。
lis <- list(a = 1:6, b = "R", c = list(TRUE, FALSE))
lis
## [[1]]
## [1] 1 2 3 4 5 6
## [[2]]
## [1] "R"
## [[3]]
## [[3]][[1]]
## [1] TRUE
## [[3]][[2]]
## [1] FALSE
其中,双括号索引是在告诉我们展示的内容来自列表的哪一个元素;单中括号的索引则告诉我们,在其之后显示的内容来自列表某元素的哪一个子元素。
9. 数据框dataframe
数据框是特殊的二维列表,是数据分析中最有用的数据存储结构。数据框以列为单位组织数据,不同的列可以包含不同的数据类型,同一列中元素必须是同一类型,且每一列长度相等。
df <- data.frame(price = c(89.2, 23.2, 21.2),
symbol = c('MOT','AAPL','IBM'),
action = c('Buy','Sell','Buy'))
df
## price symbol action
## 1 89.2 MOT Buy
## 2 23.2 AAPL Sell
## 3 21.2 IBM Buy
其中,参数price、symbol和action作为数据框中相应的列标签,存放在names属性中。在创建列表或者向量时,也可以为其命名,存放在names属性中。
attributes(df)
## $names
## [1] "price" "symbol" "action"
## $class
## [1] "data.frame"
## $row.names
## [1] 1 2 3
数据框是具有data.frame类的列表,可以用str函数查看列表中哪些对象被组织在一起:
typeof(df)
## [1] "list"
class(df)
## [1] "data.frame"
str(df)
## 'data.frame': 3 obs. of 3 variables:
## $ price : num 89.2 23.2 21.2
## $ symbol: Factor w/ 3 levels "AAPL","IBM","MOT": 3 1 2
## $ action: Factor w/ 2 levels "Buy","Sell": 1 2 1
创建数据框时,字符向量将自动转换为因子,它是离散变量的向量。 为了禁止将任何字符向量转换为因子,我们可以使用stringsAsFactors = FALSE
参数。
df <- data.frame(price = c(89.2, 23.2, 21.2),
symbol = c('MOT','AAPL','IBM'),
action = c('Buy','Sell','Buy'),
stringsAsFactors = FALSE)
小结
R中的数据容器以原子型向量为基础,原子型向量有以下几种数据类型:双整型(double),整型(integer),字符型(character),逻辑型(logical),复数类型(complex),原始类型(raw)。通过改变原子型向量的dim
与class
属性,生成下图中的五种常用数据容器,其中数据框最在数据分析中最为实用。
![8ff8045618214925b0b493016c4e3e1b.png](https://i-blog.csdnimg.cn/blog_migrate/9f02123c8f7a18821e195c3fa0df38dd.jpeg)
欢迎关注我的微信公众号, 会不定期分享量化金融与R干货。
![f0bfb73f4117ed1bbdf0a17323741d99.png](https://i-blog.csdnimg.cn/blog_migrate/a176c95b6d1d3e430624273f05f360b6.jpeg)