1. 程式人生 > >R中的基本資料管理

R中的基本資料管理

目錄

1、引例

2、建立新變數

3、變數的重編碼

4、變數的重新命名

5、缺失值

6、日期值

7、資料排序

8、資料集的合併

9、資料取子集


1、引例

現假設需要研究男性和女性在領導各自企業方式上的不同,為了很好地解答這個問題,我們可能需要各個方面的資料來進行對比分析,我們在這裡提供的方法是讓多個國家的經理的上司對他們的服務進行打分,使用的問題類似於:

1 2 3 4 5
非常不同意 不同意 既不同意也不反對 同意 非常同意

最後我們得到了這樣的一個表格:

                                                                                         

表1 領導行為的性別差異
manager date 國籍 gender age q1 q2 q3 q4 q5
1 10/24/14 US M 32 5 4 5 5 5
2 10/28/14 US F 45 3 5 2 5 5
3 10/01/14 UK F 25 3 5 5 5 2
4 10/12/14 UK M 39 3 3 4    
5 05/01/14 UK F 99 2 2 1 2 1

我們可以用R語言對上面的表格建立資料框,使用程式碼

manager<-c(1,2,3,4,5)
date<-c("10/24/08","10/28/08","10/1/08","10/12/08","5/1/09")
gender<-c("M","F","F","M","F")
age<-c(32,45,25,39,99)
q1<-c(5,3,3,3,2)
q2<-c(4,5,5,3,2)
q3<-c(5,2,5,4,1)
q4<-c(5,5,5,NA,2)
q5<-c(5,5,2,NA,1)
leadership<-data.frame(manager,data,gender,age,q1,q2,q3,q4,q5)

為了解決一些我們所感興趣的問題,首先,我們必須要解決一些關於R中資料管理方面上的一些問題

1、在問卷中,被調查者通常會跳過某些問題,就像上面第四個經理對q4和q5一樣,這時我們得到了一個不完整的資料集,這當中有一些屬於缺失值,同時年齡那一列資料當中的99也應該被重編為缺失值;

2、個數據集當中往往有成百上千個變數,而有時候我們所關心的可能就只有那幾個資料,這時候,我們需要建立只包含我們感興趣資料的資料集;

3、有時候我們需要將一些連續性的變數重編為一組類別值,比如將上表中的年齡指改成”青年”,“中年”,“老年”。


2、建立新變數

在某些實驗中,我們可能需要對現有的資料新增向量或對現有的資料集做一些改動,這是我們可以通過以下語句來實現 

變數名<-表示式

以上語句中的表示式可以包含多種運算子和函式

表2 算數運算子
運算子 描述
+ 加5
-
*
/
^或** 求冪2**2=4
x%%y 求餘(5%/%2=1)
x%/%y 整除(5%/%2=2)

建立新變數的三種方法

#第一種方法
mydata<-data.frame(x1(1,2,3,4,5),x2(2,3,4,5,6))
mydata$sumx<-madata$x1+mydata$x2
mydata$meanx<-mydata$sumx/2
#這種方法是先建立一個數據框,然後再往資料框裡新增資料
#第二種方法
attach(mydata)
mydata$sumx<-x1+x2
mydata$meanx<-(x1+x2)/2
#第三種方法
mydata<-tranform(mydata,sumx=x1+x2,
                 meanx=(x1+x2)/2)
#tranform函式還可以刪除資料集當中的某一變數,只需將某一變數的值設為NULL即可

3、變數的重編碼

有時候我們可能要根據某些變數的基本情況來對這些觀測值進行分組,這時,變數的重編碼就起到作用了

還以上面的表格資料為例,將年齡觀測值分組成"Yong"、"Middle Aged"、"Elder"

我們可以這樣做

variable[condition]<-expression
leadership$agecat[leadership$age>75]<-"Elder"
leadership$agecat[leadership$age<75&leadership$age>=55]<-"Middle age"
leadership$agecat[leadership$age<55]<-"Young"

這幾行程式碼也可以精簡成

leadership<-within(leadership,{
                    agecat<-NA
                    agecat[age>75]<-"Elder"
                    agecat[age<75&age>55]<-"Mlddle Age"
                    agent[age<55]<-"Young"})

4、變數的重新命名

將變數重新命名在R中有多中方法,在這裡主要介紹兩種方法

#(方法1)呼叫一個互動式的編輯器來修改變數名
fix(dataframe)

如下圖所示 

#(方法2)通過name()函式來重新命名變數
names(leadership)[2]<-"textdate" #將leadership資料集中的第二個變數重新命名為textdate

#names函式
#names(leadership)將返回leadership中所有的變數名
names(leadership)
 [1] "manager" "age"     "gender"  "date"    "q1"      "q2"      "q3"      "q4"     
 [9] "q5"      "agecat"
#names(leadership)表示leadership資料集中第二個變數

names(leadership)[5:9]<-c("item1","item2","item3","item4","item5")
  manager age gender     date item1 item2 item3 item4 item5 agecat
1       1  32      M 10/24/08     5     4     5     5     5  Young
2       2  45      F 10/28/08     3     5     2     5     5  Young
3       3  25      F  10/1/08     3     5     5     5     2  Young
4       4  39      M 10/12/08     3     3     4    NA    NA  Young
5       5  99      F   5/1/09     2     2     1     2     1  Elder

5、缺失值

在現實的調查當中,經常會出現被調查人跳過某些問題從而產生缺失值的情況,如上面表格中的item4和item5的第四行觀測值,也有些很怪的資料不符合實際,也應該被認為是缺失值,如上表中年齡值出現的99;缺失值的符號表示為NA即Not Available,下面介紹R中處理缺失值的方法

#is.na()函式用來檢測缺失值是否存在
is.na(leadership)
     manager   age gender  date item1 item2 item3 item4 item5 agecat
[1,]   FALSE FALSE  FALSE FALSE FALSE FALSE FALSE FALSE FALSE  FALSE
[2,]   FALSE FALSE  FALSE FALSE FALSE FALSE FALSE FALSE FALSE  FALSE
[3,]   FALSE FALSE  FALSE FALSE FALSE FALSE FALSE FALSE FALSE  FALSE
[4,]   FALSE FALSE  FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE  FALSE
[5,]   FALSE FALSE  FALSE FALSE FALSE FALSE FALSE FALSE FALSE  FALSE

#將某些值重編碼為缺失值
leadership$age[leadership$age==99]<-NA #將資料集leadership中變數age的99重編碼為缺失值
ia.na(leadership$age)
[1] FALSE FALSE FALSE FALSE  TRUE

#在具體的分析中排除缺失值的影響,只需在函式值中加入na.rm=TRUE選項
x<-c(1,2,3,NA)
sum(x)
[1] NA  #由於x中有一個缺失值,所以作用在x上的sum函式輸出值也為缺失值

x<-c(1,2,3,NA)
sum(x,na.rm=T)  #對x進行排行缺失值處理
[1] 6  

6、日期值

將字元型日期變數轉換成數值型日期變數

#as.Date()函式用於這種變數型別之間的轉換
#as.Date()基本格式:as.Date(x,"input_format")
mydate<-c("2018-12-27","2018-12-28")
as.Date(mydate)

#as.character 將數值型日期變數轉換成字元型日期變數

#另外在R語言中支援多種型別轉換
#is.datetype()這樣的函式返回TRUE或者是FALSE
#as.datetype()這樣的函式將變數轉換成相應型別

7、資料排序

#order()函式用來對資料進行排序
newdate<-leadership[order(leadership$age),]  #不要忘記加逗號','
  manager age agecat gender q1 q2 q3 q4 q5
3       3  25  Young      F  3  5  5  5  2
1       1  32  Young      M  5  4  5  5  5
4       4  39  Young      M  3  3  4 NA NA
2       2  45  Young      F  3  5  2  5  5
5       5  99   <NA>      F  2  2  1  2  1

newdata<-leadership[ordera(leadership$gender,leadership$age),] #先按性別排序,再在性別的基礎上按年齡排序
  manager age agecat gender q1 q2 q3 q4 q5
3       3  25  Young      F  3  5  5  5  2
2       2  45  Young      F  3  5  2  5  5
5       5  99   <NA>      F  2  2  1  2  1
1       1  32  Young      M  5  4  5  5  5
4       4  39  Young      M  3  3  4 NA NA

8、資料集的合併

#向資料框新增列 merge()函式
newdataframe<-merge(dataframeA,dataframeB,by="Id")

9、資料取子集

#subset()函式
newdata<-subset(leadership,age>46|age<26,select=c(q1:q5))
  q1 q2 q3 q4 q5
3  3  5  5  5  2
5  2  2  1  2  1
#with(),within(),transform()辨析對比

leadership<-within(leadership,{
                             agecat<-NA
                             agecat[age>75]<-"Elder"
                             agecat[age<75&age>55]<-"Midde Age"
                             agecat[age<55]<-"Young"})

leadership<-transform(leadership,agecat<-NA,
                             agecat[age>75]       <-"Elder",
                             agecat[age<75&age>55]<-"Midde Age",
                             agecat[age<55]       <-"Young")

#兩種方法輸出結果相同