您好,登錄后才能下訂單哦!
這篇文章主要講解了“R語言的Dataframe常用操作方法”,文中的講解內(nèi)容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“R語言的Dataframe常用操作方法”吧!
上節(jié)我們簡單介紹了Dataframe的定義,這節(jié)我們具體來看一下Dataframe的操作
首先,數(shù)據(jù)框的創(chuàng)建函數(shù)為 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.
當然,后面還有很多參數(shù)的具體用法,在此不做一一贅述,主要用到的就是前兩個。首先,“...”代表了表格數(shù)據(jù),就是要構成數(shù)據(jù)框的數(shù)據(jù)主體,row.names( )為要構成數(shù)據(jù)框的行名,那么既然數(shù)據(jù)框相當于R語言的一個表格,應該既有行名也有列名才對,那么列名又是如何給出的呢?我們知道,很多的數(shù)據(jù)處理軟件以及算法是以數(shù)據(jù)的列為單位進行的,之前我們構建矩陣的時候,默認也是按列填充(byrow=FALSE),而列名在創(chuàng)建數(shù)據(jù)框開始我們就已經(jīng)確定好了的。詳見下面代碼:
我想要創(chuàng)建一個名為“mydataframe”的數(shù)據(jù)框,首先確定數(shù)據(jù)框里面的列有哪些,然后調(diào)用函數(shù)data.frame( )函數(shù)
> 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
由此可見,數(shù)據(jù)框是把現(xiàn)有的列拼接成一個表格的一種數(shù)據(jù)結構,細心的朋友會發(fā)現(xiàn),這個數(shù)據(jù)框怎么跟上節(jié)我們講過的矩陣長得那么一樣!??!再回顧一下上節(jié)的矩陣創(chuàng)建:
> 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
確實,從長相上來說分不出差別,但是矩陣里面的元素必須一致,而數(shù)據(jù)框可以是各種類型數(shù)據(jù)的集合。這種集合不是無條件亂七八糟的集合,而是以列為單位,不同列的元素類型可以不同,但是同一列的元素類型必須一致。因此,矩陣可以看做特殊的數(shù)據(jù)框類型那么這么做有什么意義呢?在數(shù)據(jù)統(tǒng)計中,我們需要有各種各樣類型的數(shù)據(jù),就拿簡單的成績單來說,就包含了“姓名”,“學號”,“科目”等字符型元素,也包括“分數(shù)”等數(shù)值型元素,還有“是否通過”等布爾型元素,因此,從廣泛意義上來說,dataframe更具有普適性,矩陣多用在數(shù)學計算中。說歸說,我們來實際創(chuàng)建一個數(shù)據(jù)框,然后再演示一下它的具體操作:
> 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
由上可見,當沒有給數(shù)據(jù)框指定行名的時候,系統(tǒng)會默認從1開始給每行一個行號,這跟Excel表格有點類似。 還是同往常一樣,我們先學習dataframe數(shù)據(jù)類型的基本操作
數(shù)據(jù)框元素的訪問:既然矩陣是特殊的數(shù)據(jù)框,那么矩陣元素的訪問方式應該也同樣適用于dataframe嗎?不是這樣,我們知道,數(shù)據(jù)框是以行或者列為單位(行列可以轉(zhuǎn)置),因此訪問元素時只能整行或者整列訪問。即dataframe[1,](訪問第一行),dataframe[,1](訪問第一列)采用這種方式訪問列時,返回值是按行排列的形式。訪問列同樣也可以直接使用dataframe(1)訪問第一列,或者dataframe(列名)來訪問指定的列。也可以連續(xù)訪問若干列,詳見代碼:
> 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
由上可得:對數(shù)據(jù)框操作,必須以向量為單位,使用c( ) or list( ),通過上述了解,我們發(fā)現(xiàn),普通的訪問必須帶著行名和列名,這有的時候給我們帶來不必要的麻煩,比如我要計算成績平均值,帶上列名Score會給我們帶來一些困惑,于是有哪些方法可以在訪問數(shù)據(jù)庫元素時不帶著行名或者列名呢?
方法一:用attach和detach函數(shù),比如要打印所有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函數(shù)
> with(Result,{score <- scores}) > score [1] 87 98 93
上面談到了dataframe的創(chuàng)建和讀取,如果我需要添加或者刪除某一列該怎么辦呢?
> 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
上面說過了,矩陣和數(shù)據(jù)框也是兩種不同的數(shù)據(jù)類型,我們知道數(shù)據(jù)類型之間可以互相轉(zhuǎn)換,用is.***( )可以判斷某個變量是否為***類型,用as.***( )則將某個變量轉(zhuǎn)換為***類型。那么相應的,矩陣轉(zhuǎn)換為數(shù)據(jù)框類型則應為:
> 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操作一樣,數(shù)據(jù)框也有rbind和cbind函數(shù),用法大致相同,有興趣的朋友可以簡單聯(lián)系一下,這里不再贅述。
最后,我們來談一下數(shù)據(jù)框數(shù)據(jù)處理操作:
上面我們講到,利用dataframe[ 列號 ]或者dataframe[ 列值 ]可以讀取數(shù)據(jù)框的某一列,返回值仍為數(shù)據(jù)框類型,但是這部分數(shù)據(jù)不方便直接利用我們之前講過的求和,求平均值等方法進行計算分析,因為讀取的數(shù)據(jù)帶有“行名/列名”,這個為字符型變量。有的人會問,我在創(chuàng)建數(shù)據(jù)框的時候,不加行名和列名不就行了?第一,在創(chuàng)建數(shù)據(jù)框的時候,會默認給你分配行名或者列名,第二,就算不分配行名或者列名,那數(shù)據(jù)框創(chuàng)建起來還有什么意義?
> 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"]) : 參數(shù)不是數(shù)值也不是邏輯值:回覆NA > is.data.frame(mydataframe["C4"]) [1] TRUE
方法一:將數(shù)據(jù)框格式重新轉(zhuǎn)化為矩陣格式,然后按照矩陣索引的方式來找尋要處理的數(shù)據(jù)組,利用矩陣或者向量中相關函數(shù)來進行一定的數(shù)據(jù)處理。
> 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
方法二:在讀取數(shù)據(jù)框列的時候換用另外一種方法,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函數(shù)組建新的數(shù)據(jù)框,具體用法如下:
> 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
感謝各位的閱讀,以上就是“R語言的Dataframe常用操作方法”的內(nèi)容了,經(jīng)過本文的學習后,相信大家對R語言的Dataframe常用操作方法這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。