R语⾔数据类型与数据容器
R中的数据类型与存储⽅式以原⼦型向量为基础,通过改变其对应属性可以⽣成矩阵、列表和数据框等数据容器。下⾯将从原⼦型向量开始,揭⽰各个数据容器之间的内在联系,帮助⼤家更好地理解与使⽤R来存储与分析数据。
个⼈的|||PurePlay 会不定期分享量化⾦融与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
typeof 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

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。