在R中,他并不提供直接访问存储在内存中的数据的方法,而是提供特定的数据结构(我们将之称为对象)
mode:表示对象在内存中的存储类型;
基本数据类型'atomic' mode: numeric(Integer/double), complex, character和logical
递归的对象(recursive object):'list' 或 'function'
class:是一种抽象类型,或者理解为一种数据结构(数据框,因子,列表)
他主要是用来给泛型函数(参考java中泛型的概念)识别参数用。
所以当给函数传参数的时候如果发生错误,就查看class属性
class返回的是matrix,array,factor(还在Date)之类的数据结构类型
class(x)
(一)基本类型情况(参考java中的基本数据类型理解)
(1)当x是单个值,或者向量的时候,
返回的结果和mode一致,如numeric,character
(二)Object类型情况(参考java中引用数据类型情况理解)
(2)其他情况(矩阵,数组,日期,因子),
class返回(matrix,array,Date,factor)
mode返回(x中元素的类型——在内存中的存储类型)
(3)当x是数据框的时候,class返回dataframe,mode返回list
(4)当x是列表的时候,class和mode都返回list
为何数据框和列表不再适用于第二条mode返回x中元素的类型了呢?
1因为数据框其实是列表的一种特殊情况
2list和dataframe中的数据类型可以不一致,所以没法返回一个类型代表多种元素类型
如下例,你可以看到数据在内存中是列表的形式存储,却被包装成数据框来操作。(数据框其实是一种特殊的列表)
d <- data.frame(V1=c(1,2))
class(d) #"data.frame"
mode(d) #"list"
#例子2.1
x1<-c(1,2,3)
x2<-c(2,3,4)
x3<-c(3,4,5)
xmerge<-data.frame(x1,x2,x3)
class(xmerge) #dataframe
[1] "data.frame"
mode(xmerge) #list
[1] "list"
#例子2.2
xmerge[1,]
x1 x2 x3
1 1 2 3
class(xmerge[1,])
[1] "data.frame"
mode(xmerge[1,])
[1] "list"
#例子2.3
x1<-c(2,6,3)
x2<-c(3,7,4)
x3<-c(9,4,5)
xmerge<-data.frame(x1,x2,x3);xmerge
x1 x2 x3
1 2 3 9
2 6 7 4
3 3 4 5
xmerge[,1]
[1] 2 6 3
class(xmerge[,1])
[1] "numeric"
mode(xmerge[,1])
[1] "numeric"
从例子1得知,数据框的class是dataframe,而其mode是list,例子2.1加强了这个结论。
例子2.2 说明数据框的每一行class仍然是data.frame,而其mode是list,即每一行仍然是一个数据框。(因为每一行会含有不同的数据类型)
例子2.3说明数据框的每一列的class和mode都是numeric(因为列的数据类型相同,而且我们没有vector类型的说法)
#例子3.1
x1 = array(rep(1,6),dim=c(2,3))
class(x1) #matrix
mode(x1) #numeric
#例子3.2
x = array(rep("a",6),dim=c(2,3)) #矩阵是数组的二维特殊情形
class(x) #matrix
mode(x) #character
#例子3.3
x5 = array(rep("a",9),dim=c(3,3,3))
x5
, , 1
[,1] [,2] [,3]
[1,] "a" "a" "a"
[2,] "a" "a" "a"
[3,] "a" "a" "a"
, , 2
[,1] [,2] [,3]
[1,] "a" "a" "a"
[2,] "a" "a" "a"
[3,] "a" "a" "a"
, , 3
[,1] [,2] [,3]
[1,] "a" "a" "a"
[2,] "a" "a" "a"
[3,] "a" "a" "a"
class(x5) #"array" 数据结构是数组
mode(x5) #"character"
x51<-x5[,,1]
class(x51) #"matrix"
# 例子3.4
gl(2,5) #新建一个因子
[1] 1 1 1 1 1 2 2 2 2 2
Levels: 1 2
class(gl(2,5)) #"factor" 数据结构是因子
[1] "factor"
mode(gl(2,5)) #"numeric"
[1] "numeric"
例子3.1-3.4 说明一个问题:
class返回的是matrix,array,factor之类的数据结构类型。(在class中的参数是一个向量或者单个值的时候,返回值和mode相同,不会返回vector,不过可以使用is.vector()返回值是T验证其确实是向量)而mode返回的,是每一个元素的类型。
既然你说是每个元素的类型,那么为什么dataframe中mode返回的是list呢?
#例子4.1
xl = list(fruit=c("apple","banana","pear"),
price=c(1,1,1.5),
market=c("newabest"))
class(xl) # "list" 数据结构是列表
[1] "list"
mode(xl) # "list"
[1] "list"
#也就是说,;列表中的每一项都是列表
class(xl$fruit) #"character"
[1] "character"