R語言:mode和class的區別_r語言
來源:互聯網
上載者:User
關於R中的mode()和class()的區別 ############################################### 總結: mode:表示對象在記憶體中的儲存類型 基礎資料型別 (Elementary Data Type)'atomic' mode: numeric(Integer/double), complex, character和logical 遞迴的對象(recursive object): 'list' 或 'function' class:是一種抽象類別型,或者理解為一種資料結構(資料框,因子,列表) 他主要是用來給泛型函數(參考java中泛型的概念)識別參數用。 所以當給函數傳參數的時候如果發生錯誤,就查看class屬性 class返回的是matrix,array,factor(還在Date)之類的資料結構類型 class(x) (一)基本類型情況(參考java中的基礎資料型別 (Elementary Data Type)理解) (1)當x是單個值,或者向量的時候, 返回的結果和mode一致,如numeric,character (二)Object類型情況(參考java中引用資料類型情況理解) (2)其他情況(矩陣,數組,日期,因子), class返回(matrix,array,Date,factor) mode返回(x中元素的類型——在記憶體中的儲存類型) (3)當x是資料框的時候,class返回dataframe,mode返回list 當x是列表的時候,class和mode都返回list (4)當x是列表的時候,class和mode都返回list 為何資料框和列表不再適用於第二條mode返回x中元素的類型了呢。 1因為資料框其實是列表的一種特殊情況 2list和dataframe中的資料類型可以不一致,所以沒法返回一個類型代表多種元素類型 ######################################## 在R中,他並不提供直接存取儲存在記憶體中的資料的方法,而是提供特定的資料結構(我們將之稱為對象) mode:表示對象在記憶體中的儲存類型 基礎資料型別 (Elementary Data Type)'atomic' mode: numeric(Integer/double), complex, character和logical 遞迴的對象(recursive object): 'list' 或 'function' class:是一種抽象類別型,或者理解為一種資料結構 他主要是用來給泛型函數(參考java中泛型的概念)識別參數用。 如下例,你可以看到資料在記憶體中是列表的形式儲存,卻被封裝成資料框來操作。(資料框其實是一種特殊的列表) 例子1 d <- data.frame(V1=c(1,2)) class(d) #"data.frame" mode(d) #"list" 再看一個例子2 例子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 mode(xmerge) #list 例子2.2 >class(xmerge[1,]) [1]"data.frame" > mode(xmerge[1,]) [1]"list" > xmerge[1,] x1 x2 x3 1123 例子2.3 > x1<-c(2,6,3) > x2<-c(3,7,4) > x3<-c(9,4,5) > xmerge<-data.frame(x1,x2,x3) >class(xmerge[,1]) [1]"numeric" > mode(xmerge[,1]) [1]"numeric" > xmerge[,1] [1]263 > xmerge x1 x2 x3 1239 2674 3345 從例子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) #建立一個因子 class(gl(2,5)) #"factor" 資料結構是因子 mode(gl(2,5)) #"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" 資料結構是列表 mode(xl) # "list" #也就是說,;列表中的每一項都是列表 #class(xl$fruit) #"character" 例子4.1說明,列表中class和mode都是list 但是class(xl$fruit) 得到的是"character" 先說明下 1list[[index]] 得到的是元素(組件) 2list[index] 得到的是子列表 這點請見《R語言經典執行個體》P119-121 > jj<-list(name=c("jos","xuan"),salary=55000,union=T) > jj[[1]] [1]"jos""xuan" >class(jj[[1]]) #mode傳回值也是character [1]"character" > jj[1] $name [1]"jos""xuan" >class(jj[1]) #mode傳回值也是list [1]"list" > jj[[2]] [1]55000 >class(jj[[2]]) [1]"numeric" > jj[2] $salary [1]55000 >class(jj[2]) [1]"list" > jj[[1]][1] [1]"jos" >class(jj[[1]][1]) [1]"character" > mode(jj[[1]][1]) [1]"character" > jj[[3] [1] TRUE > jj[3] $union [1] TRUE >is.vector(jj[[1]]) [1] TRUE >is.vector(jj[[2]]) [1] TRUE >is.numeric(jj[[1]]) [1] FALSE >is.numeric(jj[[2]]) [1] TRUE >is.vector(jj[[3]]) [1] TRUE >is.list(jj[1]) [1] TRUE >is.vector(jj[1]) [1] TRUE 因為s.vector(jj[1])傳回值都是T,這個結果似乎,不是很令人信服 於是,搜尋?is.vector() 查看協助說明之後,我們知道了,原來預設的情況下是any,對於任意的原生類型和list以及運算式,都會返回T 例子5 例子5.1 > x <- c(a =1, b =2) > x a b 12 >class(x) [1]"numeric" >is.vector(x) [1] TRUE >is.vector(x,"double") #預設是雙精確度的,要是整型,要加L [1] TRUE >is.vector(x,"Integer") [1] FALSE 例子5.2 >is.vector(jj[[1]],"list") [1] FALSE >is.vector(jj[1],"list") [1] TRUE 說明,jj[1]實質上是一種list,而非向量 再看?mode()這一句中協助文檔的寫法 Description Get or set the type or storage mode of an object. value a character string giving the desired mode or ‘storage mode’ (type) of the object. mode(x) <- "newmode"(修改x的資料類型為新的類型newmode) changes the mode of object x to newmode. This is only supported if there is an appropriate as.newmode function, for example "logical", "integer", "double", "complex", "raw", "character", "list", "expression", "name", "symbol" and "function". Attributes are preserved (but see below).