R 語言的Dataframe經常使用操做

上節咱們簡單介紹了Dataframe的定義,這節咱們具體來看一下Dataframe的操做算法

首先,數據框的建立函數爲 data.frame( ),參考R語言的幫助文檔,咱們來了解一下data.frame( )的具體用法:數據庫

Usage
data.frame(..., row.names = NULL, check.rows = FALSE,
           check.names = TRUE, fix.empty.names = TRUE,
           stringsAsFactors = default.stringsAsFactors())
default.stringsAsFactors()
Arguments
... :these arguments are of either the form value or tag = value. Component names are created based on the tag (if present) or the deparsed argument itself.
row.names :NULL or a single integer or character string specifying a column to be used as row names, or a character or integer vector giving the row names for the data frame.

固然,後面還有不少參數的具體用法,在此不作一一贅述,主要用到的就是前兩個。首先,「...」表明了表格數據,就是要構成數據框的數據主體,row.names( )爲要構成數據框的行名,那麼既然數據框至關於R語言的一個表格,應該既有行名也有列名纔對,那麼列名又是如何給出的呢?咱們知道,不少的數據處理軟件以及算法是以數據的列爲單位進行的,以前咱們構建矩陣的時候,默認也是按列填充(byrow=FALSE),而列名在建立數據框開始咱們就已經肯定好了的。詳見下面代碼:數組

我想要建立一個名爲「mydataframe」的數據框,首先肯定數據框裏面的列有哪些,而後調用函數data.frame( )函數數據結構

> C1 <-c(1,2,3,4)
> C2 <-c(5,6,7,8)
> C3 <-c(9,10,11,12)
> C4 <-c(13,14,15,16)
> C5 <-c(17,18,19,20)
> mydataframe <- data.frame(C1,C2,C3,C4,C5,row.names = c("R1","R2","R3","R4"))
> mydataframe
   C1 C2 C3 C4 C5
R1  1  5  9 13 17
R2  2  6 10 14 18
R3  3  7 11 15 19
R4  4  8 12 16 20

因而可知,數據框是把現有的列拼接成一個表格的一種數據結構,細心的朋友會發現,這個數據框怎麼跟上節咱們講過的矩陣長得那麼同樣!!!再回顧一下上節的矩陣建立:函數

> mydata <- c(1:20)
> cnames <- c("C1","C2","C3","C4","C5")
> rnames <- c("R1","R2","R3","R4")
> myarray <- matrix(mydata,nrow = 4,ncol = 5,dimnames = list(rnames,cnames))
> myarray
   C1 C2 C3 C4 C5
R1  1  5  9 13 17
R2  2  6 10 14 18
R3  3  7 11 15 19
R4  4  8 12 16 20

確實,從長相上來講分不出差異,可是矩陣裏面的元素必須一致,而數據框能夠是各類類型數據的集合這種集合不是無條件亂七八糟的集合,而是以列爲單位,不一樣列的元素類型能夠不一樣,可是同一列的元素類型必須一致。所以,矩陣能夠看作特殊的數據框類型那麼這麼作有什麼意義呢?在數據統計中,咱們須要有各類各樣類型的數據,就拿簡單的成績單來講,就包含了「姓名」,「學號」,「科目」等字符型元素,也包括「分數」等數值型元素,還有「是否經過」等布爾型元素,所以,從普遍意義上來講,dataframe更具備普適性,矩陣多用在數學計算中。說歸說,咱們來實際建立一個數據框,而後再演示一下它的具體操做:學習

> names <- c("小明","小紅","小蘭")
> StudentID <- c("2014","2015","2016")
> subjects <- c("英語","英語","英語")
> scores <- c(87,98,93)
> Result <- data.frame(StudentID,names,subjects,scores)
> Result
  StudentID names subjects scores
1      2014  小明     英語     87
2      2015  小紅     英語     98
3      2016  小蘭     英語     93

由上可見,當沒有給數據框指定行名的時候,系統會默認從1開始給每行一個行號,這跟Excel表格有點相似。 仍是同往常同樣,咱們先學習dataframe數據類型的基本操做spa

數據框元素的訪問:既然矩陣是特殊的數據框,那麼矩陣元素的訪問方式應該也一樣適用於dataframe嗎?不是這樣,咱們知道,數據框是以行或者列爲單位(行列能夠轉置),所以訪問元素時只能整行或者整列訪問。即dataframe[1,](訪問第一行),dataframe[,1](訪問第一列)採用這種方式訪問列時,返回值是按行排列的形式。訪問列一樣也能夠直接使用dataframe(1)訪問第一列,或者dataframe(列名)來訪問指定的列。也能夠連續訪問若干列,詳見代碼:orm

> Result[1,] #訪問第一行
  StudentID names subjects scores
1      2014  小明     英語     87
> Result[,1] #訪問第一列 
[1] 2014 2015 2016
Levels: 2014 2015 2016
> Result[1] #訪問第一列
  StudentID
1      2014
2      2015
3      2016
> Result["names"] #訪問指定標號的列
  names
1  小明
2  小紅
3  小蘭

> Result[1:3,]  #訪問1-3行 StudentID names subjects scores 1 2014 小明 英語 87 2 2015 小紅 英語 98 3 2016 小蘭 英語 93 > Result[1:3]  #訪問1-3列 StudentID names subjects 1 2014 小明 英語 2 2015 小紅 英語 3 2016 小蘭 英語 > Result[c(1,3),]  #只訪問1,3行,注意寫法 c( ) StudentID names subjects scores 1 2014 小明 英語 87 3 2016 小蘭 英語 93 > Result[c(1,4)]  #只訪問1,4列,注意寫法 c( ) StudentID scores 1 2014 87 2 2015 98 3 2016 93 > Result[c("names","scores")]  #只訪問names和scores列,注意寫法 c( ) names scores 1 小明 87 2 小紅 98 3 小蘭 93

 由上可得:對數據框操做,必須以向量爲單位,使用c( ) or list( ),經過上述瞭解,咱們發現,普通的訪問必須帶着行名和列名,這有的時候給咱們帶來沒必要要的麻煩,好比我要計算成績平均值,帶上列名Score會給咱們帶來一些困惑,因而有哪些方法能夠在訪問數據庫元素時不帶着行名或者列名呢?blog

方法一:用attach和detach函數,好比要打印全部names,那麼能夠寫成:索引

> attach(Result)
The following objects are masked _by_ .GlobalEnv:
    names, scores, StudentID, subjects
The following objects are masked from Result (pos = 3):
    names, scores, StudentID, subjects
> name <- names
> score <-scores
> detach(Result)
> name
[1] "小明" "小紅" "小蘭"
> score
[1] 87 98 93
> mean(score)
[1] 92.66667

 方法二:用with函數

> with(Result,{score <- scores})
> score
[1] 87 98 93

 上面談到了dataframe的建立和讀取,若是我須要添加或者刪除某一列該怎麼辦呢?

> Result$age<-c(12,14,13)  #添加age列
> Result
  StudentID names subjects scores age
1      2014  小明     英語     87  12
2      2015  小紅     英語     98  14
3      2016  小蘭     英語     93  13
> Result2 <- Result[-2]  #刪除name列 > Result2  StudentID subjects scores age 1 2014 英語 87 12 2 2015 英語 98 14 3 2016 英語 93 13

 若是我須要查詢成績等於98的學生的信息該怎麼辦呢?

> Result[which(Result$scores==98),]
  StudentID names subjects scores age
2      2015  小紅     英語     98  14

 上面說過了,矩陣和數據框也是兩種不一樣的數據類型,咱們知道數據類型之間能夠互相轉換,用is.***( )能夠判斷某個變量是否爲***類型,用as.***( )則將某個變量轉換爲***類型。那麼相應的,矩陣轉換爲數據框類型則應爲:

> myarray
   C1 C2 C3 C4 C5
R1  1  5  9 13 17
R2  2  6 10 14 18
R3  3  7 11 15 19
R4  4  8 12 16 20
> myarrayframe <- as.data.frame(myarray)
> myarrayframe
   C1 C2 C3 C4 C5
R1  1  5  9 13 17
R2  2  6 10 14 18
R3  3  7 11 15 19
R4  4  8 12 16 20
> is.data.frame(myarray)
[1] FALSE
> is.data.frame(myarrayframe)
[1] TRUE

 跟矩陣matrix操做同樣,數據框也有rbind和cbind函數,用法大體相同,有興趣的朋友能夠簡單聯繫一下,這裏再也不贅述。

 最後,咱們來談一下數據框數據處理操做:

上面咱們講到,利用dataframe[ 列號 ]或者dataframe[ 列值 ]能夠讀取數據框的某一列,返回值仍爲數據框類型,可是這部分數據不方便直接利用咱們以前講過的求和,求平均值等方法進行計算分析,由於讀取的數據帶有「行名/列名」,這個爲字符型變量。有的人會問,我在建立數據框的時候,不加行名和列名不就好了?第一,在建立數據框的時候,會默認給你分配行名或者列名,第二,就算不分配行名或者列名,那數據框建立起來還有什麼意義?

> mydataframe
   C1 C2 C3 C4 C5
R1  1  5  9 13 17
R2  2  6 10 14 18
R3  3  7 11 15 19
R4  4  8 12 16 20
> mydataframe["C4"]
   C4
R1 13
R2 14
R3 15
R4 16
> mean(mydataframe["C4"])
[1] NA
Warning message:
In mean.default(mydataframe["C4"]) : 參數不是數值也不是邏輯值:回覆NA
> is.data.frame(mydataframe["C4"])
[1] TRUE

方法一:將數據框格式從新轉化爲矩陣格式,而後按照矩陣索引的方式來找尋要處理的數據組,利用矩陣或者向量中相關函數來進行必定的數據處理。

> myarray2 <- as.matrix(mydataframe)
> is.matrix(myarray2)
[1] TRUE
> myarray2
   C1 C2 C3 C4 C5
R1  1  5  9 13 17
R2  2  6 10 14 18
R3  3  7 11 15 19
R4  4  8 12 16 20
> x <- myarray[,3] #讀取第3列的值
> x
R1 R2 R3 R4 
 9 10 11 12 
> is.vector(x) #查看x是否爲向量類型
[1] TRUE
> mean(x)
[1] 10.5
> sum(x)
[1] 42

 方法二:在讀取數據框列的時候換用另一種方法,dataframe$(行名或者列名),返回值是vector類型

> c <- mydataframe$C3
> c
[1]  9 10 11 12
> is.vector(c)
[1] TRUE
> mean(c)
[1] 10.5
> sum(c)
[1] 42

 同時,也能夠利用dataframe$(新的列名) <- 新的向量,來給dataframe添加新的列,具體操做以下:

> mydataframe$sum <- mydataframe$C1 +mydataframe$C4
> mydataframe$mean <- (mydataframe$C1+mydataframe$C4)/2
> mydataframe
   C1 C2 C3 C4 C5 sum mean
R1  1  5  9 13 17  14    7
R2  2  6 10 14 18  16    8
R3  3  7 11 15 19  18    9
R4  4  8 12 16 20  20   10

 最推崇的是下一種方法,直接利用transform函數組建新的數據框,具體用法以下:

> x1 <- mydataframe$C1
> x2 <- mydataframe$C3
> mydataframe2 <- transform(mydataframe,sum2=x1+x2,mean2=(x1+x2)/2)
> mydataframe2
   C1 C2 C3 C4 C5 sum mean sum2 mean2
R1  1  5  9 13 17  14    7   10     5
R2  2  6 10 14 18  16    8   12     6
R3  3  7 11 15 19  18    9   14     7
R4  4  8 12 16 20  20   10   16     8
相關文章
相關標籤/搜索