標籤:

Challenge2:R語言數據結構入門

<一>R語言入門

在學習R之前,本來以為學過其他基礎編程語言會容易些,沒想到還是踩坑不少,而且它的語法和其他語言還是有很多不同之處,光是什麼時候用括弧,什麼時候用中括弧就暈了,不知道能否歸納為需要訪問(調用)元素時用中括弧,列表的元素調取用雙中括弧,而涉及到函數的則都用括弧。

自己算是看了2~3遍,一些不太懂的地方都努力去找了解釋,比如複數型是什麼,因子到底怎樣理解等等,下文的例子是自己列舉的,希望能給大家更多啟示。

<二>R語言數據結構

R可以處理的數據類型(Class)有:

  • 數值型 eg:1,37,8.125467,10/25/2006
  • 字元型 (常被雙引號包圍的)eg:「Poor」,「Type1」
  • 邏輯型 eg:TRUE,FALSE
  • 複數型(虛數) eg:3.5+2.1i
  • 原生型(位元組) eg:"Hello"存儲值為: 48 65 6c 6c 6f

我們在處理時還需要告訴R一些數據類型具體處理方式,如將數值型(eg:1,2,3)和類別型(eg:Poor,Type1)區別對待,類別型變數又叫做因子,而10/25/2006屬於日期數據,第一列中的編號常做為行名rownames,被稱作實例型標識符。

R中存儲數據的共有6種數據結構:向量,矩陣,數組,數據框,列表,因子,關係如下:

1.向量 Vector

存儲數值型、字元型或邏輯型的一維數組,格式為:向量名<-c(數據)

只含一個元素的向量叫標量,用於保存常量

> a<-c(1,2,3,4)n> b<-c("Cat","Dog","Monkey")n> c<-c(TRUE,FALSE,TRUE,TRUE)n> #訪問單個元素,只需要在中括弧里輸入此元素對應次序n> b[2]n[1] "Dog"n> #訪問多個連續元素,在中括弧中用冒號連接首尾元素次序n> a[1:3]n[1] 1 2 3n> #訪問多個非連續元素,在中括弧輸入c(元素對應次序)n> c[c(1,3,4)]n[1] TRUE TRUE TRUEn> #數組長度n> length(b)n[1] 3n> #標量n> d<-45.343n

2.矩陣 Matrix

存儲同一種數據類型(數值型、字元型或邏輯型)的二維數組,格式為:

矩陣名<-matrix(數據,nrow=行數,ncol=列數,byrow=TRUE/FALSE,dianames=list(行名,列名)

默認元素按列填充,除非byrow=TRUE

> #輸入數據,命名行名,列名n> num<-c(200,50,400,60)n> rnames<-c("A商品","B商品")n> cnames<-c("單價","數量")n> #創建矩陣,按行填充n> d<-matrix(num,nrow = 2,ncol = 2,byrow = TRUE,dimnames = list(rnames,cnames))n> dn 單價 數量nA商品 200 50nB商品 400 60n> #通過下標記號訪問元素n> d[1,1]n[1] 200n> d[1,]n單價 數量 n 200 50 n> d[2,c(1,2)]n單價 數量 n 400 60 n

3.數組 Array

存儲同一種數據類型(數值型、字元型或邏輯型)的多維數組,格式為:

數組名<-array(數據,c(各維度最大值),dianames=list(維度名))

訪問元素方式與矩形類似

>#輸入數據,命名各維度名稱n> num<-c(200,700,50,40,300,400,80,60)n> dim1<-c("A商品","B商品")n> dim2<-c("單價","數量")n> dim3<-c("P公司","Q公司")n>#創建數組n> s<-array(num,c(2,2,2),dimnames=list(dim1,dim2,dim3))n> sn, , P公司nn 單價 數量nA商品 200 50nB商品 700 40nn, , Q公司nn 單價 數量nA商品 300 80nB商品 400 60n

4.數據框 Data Frame

可存儲不同數據類型(數值型、字元型,邏輯型等)的多維數組,但每列數據類型必須相同

格式為:數據框名<-data.frame(每列數據),如有實例標識符用row.name=列名指定

>#輸入每列數據n> ID<-c(1,2,3,4)n> name<-c("小白","小紅","小明","小剛")n> course<-c("語文","數學","英語","數學")n> score<-c(89,60,93,45)n> status<-c("優","良","優","差")n>#創建數據框n> scoredata<-data.frame(ID,name,course,score,status)n> scoredatan ID name course score statusn1 1 小白 語文 89 優n2 2 小紅 數學 60 良n3 3 小明 英語 93 優n4 4 小剛 數學 45 差n

訪問元素的方式有多種,可以像向量一樣,在中括弧里輸入訪問的列的次序,或是列名,也可以用「數據框名$要訪問的列」

> scoredata[c(2,4)]n name scoren1 小白 89n2 小紅 60n3 小明 93n4 小剛 45n> scoredata[c("course","status")]n course statusn1 語文 優n2 數學 良n3 英語 優n4 數學 差n> scoredata$namen[1] 小白 小紅 小明 小剛n> table(scoredata$name,scoredata$status)n 差 良 優n 小白 0 0 1n 小剛 1 0 0n 小紅 0 1 0n 小明 0 0 1n

另外還能用attach(),detach()和with()簡化,不必用「數據框名$要訪問的列」,而是直接輸入要訪問的列名,上面name和status的表格可以簡化為:

>#attach開頭,detach結尾n> attach(scoredata)n> table(name,status)n statusnname 差 良 優n 小白 0 0 1n 小剛 1 0 0n 小紅 0 1 0n 小明 0 0 1n>detach(scoredata)n>#with用法:with(數據框名,{要執行的代碼})n> with(scoredata,{table(name,status)})n statusnname 差 良 優n 小白 0 0 1n 小剛 1 0 0n 小紅 0 1 0n 小明 0 0 1n

attach使用時要注意名稱相同的對象不止一個時,會優先調用最原始的那個

with使用時注意如果要執行的代碼只有一條,花括弧可以省略;其賦值只在with()中生效,如果要使其在全局環境生效,需要用<<-代替<-,例如:

> with(scoredata,{n+ t1<-table(name,score)n+ t2<<-table(name,score)})n> t1nError: object t1 not foundn> t2n scorenname 45 60 89 93n 小白 0 0 1 0n 小剛 1 0 0 0n 小紅 0 1 0 0n 小明 0 0 0 1n

5.列表 List

列表是一些對象(或成分)的有序集合,裡面可以包含向量、矩陣、數據框、其他列表

格式為:列表名<-list(名稱1=對象1,名稱2=對象2……)

例如:共有多少小朋友,有多少人得了優

> num<-nrow(scoredata)n> good<-scoredata[scoredata$status=="優",]n> lessons<-scoredata$coursen> lessonsn[1] 語文 數學 英語 數學nLevels: 數學 英語 語文n> sub<-list(學生數量=num,獲優者數據=good,lessons)n> subn$學生數量n[1] 4nn$獲優者數據n ID name course score statusn1 1 小白 語文 89 優n3 3 小明 英語 93 優nn[[3]]n[1] 語文 數學 英語 數學nLevels: 數學 英語 語文nn#訪問列表中的數據n> f<-sub[[3]]n> fn[1] 語文 數學 英語 數學nLevels: 數學 英語 語文n> g<-sub[["學生數量"]]n> gn[1] 4n

此處要注意比較容易踩的坑是good<-scoredata()里的逗號,忘記了就會變成下面這樣

> good<-scoredata[scoredata$status=="優"]n> goodn ID course statusn1 1 語文 優n2 2 數學 良n3 3 英語 優n4 4 數學 差n

6.因子 Factor

名義型(類別)變數和有序型變數稱為因子,如語文,數學就是名義型,優良差就是有序型,在處理數據時用函數factor()將其儲存為整數向量[1…k]

有序型需要在factor()中指定參數order=TRUE

字元型的數據默認按字母順序排列,如「優」「良」「差」,默認排序是「差」「良」「優」,可以通過level重新排序

status<-factor(status,order=TRUE,levels=c("優","良","差"))n

數值型可以用levels和labels來編碼成因子,如下例,性別原來用1,2來指代,在factor轉換後,在表中才能被寫作男女,註:cblind()用來添加列數據,rbind()用來添加行數據

> gender<-c(1,1,2,1)n> sex<-factor(gender,levels=c(1,2),labels=c("男","女"))n> scoredata1<-cbind(scoredata,sex)n> scoredata1n ID name course score status sexn1 1 小白 語文 89 優 男n2 2 小紅 數學 60 良 男n3 3 小明 英語 93 優 女n4 4 小剛 數學 45 差 男n

<三>從Excel導入數據的方法

1.將Excel的格式另存為.csv再導入

名稱<-read.table(文件路徑,處理數據的方式)n

2.安裝JAVA後再安裝xlsxjars包和rJava包,之後運行代碼就可以導入Excel工作簿中第一個工作表

library(xlsx)nworkbook<-"文件路徑"n名稱<-read.xlsx(workbook,1)n

3.使用剪貼板

名稱 <- read.table("clipboard", 處理數據的方式)n

4.在Rstudio中直接導入


推薦閱讀:

用數據化的方式解析投資條款之十一:最惠國條款
第四講實踐:人均GDP和政府廉潔度對幸福指數有何影響!!
簡單的認識R語言和邏輯斯蒂回歸
數據分析中數據趨勢的判斷

TAG:数据分析 |