关于R中的mode()和class()的区别

在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"

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值