在實際分析數據之前,必須對數據進行清理和轉化,使數據符合相應的格式,提高數據的質量。數據處理通常包括增加新的變量、處理缺失值、類型轉換、數據排序、數據集的合並和獲取子集等。
一,增加新的變量
通常需要根據數據框中的現有列,按照特定的公式、業務邏輯,向數據框中新增變量,常用的操作符是:
- 算術運算符是:+ - * /,求模(%%),整除(%/%),求冪(^ 或 **)
- 比較運算符是:不等是 !=,相等是 ==,
- 邏輯運算符與(&)、或(|)和非(!)。
舉個例子,有數據框mydata
mydata<-data.frame(x1=c(2,2,6,4),x2=c(3,4,2,8))
向數據框增加新的變量,通常的做法是:
attach(mydata) mydata$sumx<-x1+x2 mydata$meanx<-(x1+x2)/2 detach(mydata)
第二個方法是:使用transform()函數,該函數只用於數據框:
mydata<- transform(mydata ,sumx=x1+x2 ,meanx=(x1+x2)/2)
第三個方法是:使用within()函數,返回整個數據框:
mydata<- within(mydata,{ sumx <- x1+x2, meanx <- (x1+x2)/2 })
第四個方法是:使用dplyr包中的mutate()函數,通過name=value的方式來添加新列:
mydata<- mutate(mydata, sumx = x1+x2, meanx = (x1+x2)/2 )
二,對現有變量重新編碼
重新編碼是根據一個變量或其他多個變量的現有值,對現有的變量重新賦值,常用於把錯誤的值替換為正確值。重編碼語句是:
variable[condition] <- expression
該語句僅在condition的值為TRUE時,執行賦值操作:
mydata$x1[ mydata$x1<3 ]<- 1
也可以使用更為緊湊的寫法
mydata<-within(mydata,{x1[x1<3]<- 1})
注意:邏輯運算符等號是==
三,變量的重命名
查看數據框的變量名,函數names(df)返回變量名的向量:
names(mydata)
重命名現有的變量名,
names(df)[index] <- "new name" names(df)[start:end] <- c("new name"....)
plyr包中有一個rename()函數,可用於修改數據框的變量名,rename()函數的語法是:
rename(x, replace, warn_missing = TRUE, warn_duplicated = TRUE)
參數 replace是一個命名向量,格式是c("colname"="newname",...),使用示例如下:
df <- rename(df,c("colname1"="newname","colname2"="newname"))
四,數據框的變量存在缺失值
缺失值是指不可用值,以符號NA表示,缺失值是不可比較的,只能使用is.na()檢查是否存在缺失值,通過函數na.omit()移除所有含有缺失值的觀測。
dataset<-within(dataset,{var1<- ifelse(is.na(var1),0,var1)}) dataset<-na.omit(dataset)
舉個例子,創建4行3列的矩陣m,並轉換為數據框:
> d <-data.frame(matrix(sample(c(NA, 1:4), 12, replace = TRUE), 4)) > d X1 X2 X3 1 NA 4 1 2 1 2 NA 3 1 4 2 4 NA NA 4
1,把變量的缺失值替換為默認值
替換數據框中變量X1的缺失值,使用within()函數,不會修改數據框的數據,需要把函數返回的結果重新賦值給d對象:
> d <- within(d,{X1[is.na(X1)] <-0}) > d X1 X2 X3 1 0 4 1 2 1 2 NA 3 1 4 2 4 0 NA 4
2,當變量出現缺失值時,移除觀測
使用函數 na.omit(),用於把數據框中變量為NA的觀測移除,處理的結果中不任意一個觀測中都不包含NA的變量值
> d <- na.omit(d) > d X1 X2 X3 1 0 4 1 3 1 4 2
五,數據排序
對數據框進行排序,常用的函數是order(),默認的排序方向是升序,在排序變量前邊加一個減號,按照降序方向排序。
該函數返回的結果是特定變量在數據框中的行序號序列,行序號按照升序或降序排列。
舉個例子,創建一個數據框d:
> d <-data.frame(matrix(sample(c(1:6), 12, replace = TRUE), 4)) > d X1 X2 X3 1 2 1 4 2 4 4 6 3 2 4 2 4 2 2 5
按照數據框的變量X3,獲取觀測的升序排列,依次為:序號為3的觀測、序號為1的觀測、序號為4的觀測和序號為2的觀測
> order(d$X3) [1] 3 1 4 2
按照觀測的序號的排列,從數據框中按照行序號重新獲取數據,就得到按照變量X3升序的有序結果:
> d[order(d$X3),] X1 X2 X3 3 2 4 2 1 2 1 4 4 2 2 5 2 4 4 6
對多個列進行排序,其中按照X3列升序,X2列降序:
> d[order(d$X3, -d$X2),]
可以把排序操作寫的更緊湊點:
dataset = dataset[with(dataset, order(var1, -var2)), , ...]
六,排名
使用rank()函數對向量的元素進行排名
rank(x, na.last = TRUE, ties.method = c("average", "first", "last", "random", "max", "min"))
參數注釋:
- x:向量
- na.last:控制如何對象NA的順序,如果設置為TRUE,那么把缺失值排最后一位;如果設置為FALSE,把缺失值排在第一位;如果設置位NA,移除缺失值;
- ties.method:字符類型,用於指定如何處理相同值的排序,相同值構成的結構叫做ties。
The "first" method results in a permutation with increasing values at each index set of ties, and analogously "last" with decreasing values. The "random" method puts these in random order whereas the default, "average", replaces them by their mean, and "max" and "min" replaces them by their maximum and minimum respectively, the latter being the typical sports ranking.
例如,向數據框中增加排名字段Rank,該字段按照x1變量進行排名:
mydata<-data.frame(x1=c(2,2,6,4),x2=c(3,4,2,8)) mydata$Rank <- rank(mydata$x1,ties.method = "first") x1 x2 Rank 1 2 3 1 2 2 4 2 3 6 2 4 4 4 8 3
七,數據集的合並
把兩個數據集合並為一個,這涉及到向數據框中添加列,向數據框中添加行。
1,向數據框中添加列
向數據框中添加列,可以使用merge()函數,也可以使用cbind()函數,這兩個函數的區別是:
- cbind()函數是根據列進行合並,合並的前提是每個對象擁有相同的行數,以相同的順序排序。
- merge()函數是根據列進行合並,該函數的功能類型關系型數據庫的Join命令,不同要求每個對象擁有相同的行數,使用靈活。
Merge函數的語法定義:
merge(x, y, by = intersect(names(x), names(y)), by.x = by, by.y = by, all = FALSE, all.x = all, all.y = all, sort = TRUE, suffixes = c(".x",".y"), incomparables = NULL, ...)
參數注釋:
- x,y:是進行合並的兩個數據框對象;
- by:按照兩個對象的名稱相同的列進行合並;
- by.x,by.y:分別指定x對象和y對象匹配的列名;
- all:對於不滿足匹配條件時,是否保留列值;如果設置為FALSE,那么相當於INNER JOIN命令,返回的結果集只保留匹配成功的數據行;如果設置為TRUE,那么相當於FULL JOIN,保留x和y中不匹配的數據行,並把不匹配的列值設置為NA;
- all.x,all.y:分別設置x和y是否保留列值;如果設置all.x=TRUE,all.y=FALSE,那么相當於LEFT JOIN命令,返回的結果集只保留x對象的數據行,不匹配的y對象的數據行行的列值設置為NA;如果設置為all.x=FALSE,all.y=TRUE,那么相當於RIGHT JOIN命令,返回的結果集只保留y對象的數據行,不匹配的x對象的數據行行的列值設置為NA。
- sort:返回的結果集是否排序,排序列是by參數的對象
- suffixes:后綴名,默認值是c(".x",".y"),當合並的兩個對象擁有相同的列名時,R把相同的列名后面加上該后綴名,以唯一區分結果集的列名;
- incomparables:不能匹配的值
2,向數據框中添加行
使用rbind()函數,根據行進行合並,向數據框中添加數據行,相當於關系型數據庫的求求並集。要求兩個數據庫必須擁有相同名稱的變量,而變量的順序可以不同。
八,選取子集
1,選擇變量
從一個數據框中選擇有限數量的變量,數據框中的元素是通過dataframe[rows_vector , colunms_vector],如果不設置行的下標(,),表示選擇所有行,
mydata <- mydata[,c(col,,...)]
2,剔除變量
把特定的變量剔除,只選入剩余的變量。操作符 %in% 返回邏輯型向量,用法是:
- 用法 a %in% table
- a值是否包含於table中,為真時輸出TURE,為假時輸出FALSE
例如,mydata有四個變量c1,c2,c3,c4,myvars的結果是c(TRUE,FALSE,TRUE,FALSE),對該變量求非(!myvars)之后是 c(FALSE,TRUE,FALSE,TRUE),在根據數據框的下標來選入特定的變量。
myvars <- names(mydata) %in% c("c1","c3") mydata <- mydata[!myvars]
3,選入觀測
選入觀測,可以根據觀測的序號來選擇,也可以根據特定的條件來選擇:
mydata <- mydata[1:5,,...] mydata <- mydata[mydata$c1<=5 & mydata$c2>=20,,...]
還有一個函數which,也能用於選入觀測:
which(x, arr.ind = FALSE, useNames = TRUE)
which函數返回的是邏輯值的向量,which()函數的用法是:用法which(test),返回test為真值的位置(指針)。
4,根據條件選擇子集
subset()函數是選擇數據庫的變量和觀測最簡單的方法,
mydata <- subset(mydata, c1<=5 & c2>=20, select=c("c1","c2",,,))
subset()函數的語法是:
subset(x, subset, select, drop = FALSE)
參數注釋:
- x:數據框對象
- subset:該參數是邏輯表達式,對於數據框而言,該參數作用於數據行,用於選擇數據行,其中,等於使用雙等號(==)表示;
- select:要選擇的變量構成的向量
- drop:邏輯值,要剔除的變量構成的向量
參考文檔: