1. 程式人生 > >R語言學習筆記(三)資料處理

R語言學習筆記(三)資料處理

本文的示例資料框集(egData)如下:
這裡寫圖片描述
值標籤:

if(FALSE){值標籤,levels代表變數實際值,labels代表標籤值}
egData$sex <- factor(egData$sex, levels = c(1,2),labels = c("male", "female"))

這裡寫圖片描述
簡單的資料處理函式:

if(FALSE){顯示物件中元素/成分的數量}
length(egData)
if(FALSE){顯示物件的維度}
dim(egData)
if(FALSE){顯示物件的結構}
str(egData)
if(FALSE){顯示物件的類或型別}
class(egData)
if
(FALSE){顯示物件的模式} mode(egData) if(FALSE){顯示物件中各成分的名稱} names(egData) if(FALSE){列出物件的開始部分,一般前6行} head(egData) if(FALSE){列出物件的結束部分,一般最後6行} tail(egData)

這裡寫圖片描述

if(FALSE){編輯物件}
edit(egData)
if(FALSE){編輯物件,並儲存}
egData <- edit(egData)
if(FALSE){編輯物件}
fix(egData)

這裡寫圖片描述

if(FALSE){將物件併入一個向量}
x <- c(c(1,2,3)
, c(4,5,6))

這裡寫圖片描述

if(FALSE){按列合併物件}
x <- rbind(c(1,2,3), c(4,5,6))

這裡寫圖片描述

if(FALSE){按行合併物件}
x <- cbind(c(1,2,3), c(4,5,6))

這裡寫圖片描述

if(FALSE){新增新變數}
egData$score3 <- c(55,78,90,NA,80,NA,67)

這裡寫圖片描述

if(FALSE){算術運算子}
egData$total <- egData$score1+egData$score2+egData$score3

這裡寫圖片描述

if(FALSE){邏輯運算子,對變數進行重編碼}
egData$age
[egData$age > 18] <- "Adult" egData$age[egData$age >= 12 & egData$age <= 18] <- "Youth" egData$age[egData$age < 12] <- "Kid"

這裡寫圖片描述

if(FALSE){變數重新命名,方法1,互動式修改}
fix(egData)
if(FALSE){變數重新命名,方法2,呼叫reshape包的rename方法}
install.packages("reshape")
library(reshape)
egData <- rename(egData, c(age="ageType"))
if(FALSE){變數重新命名,方法3,利用names方法}
names(egData)[2] <- "ageType"

這裡寫圖片描述

if(FALSE){缺失值}
if(FALSE){判斷缺失值}
is.na(egData$total)
if(FALSE){排除缺失值}
sum(egData$total, na.rm = TRUE)
if(FALSE){刪除缺失值}
x <- na.omit(egData)

這裡寫圖片描述

if(FALSE){日期函式}
if(FALSE){當天的日期}
Sys.Date()
if(FALSE){當前的日期和時間}
date()
if(FALSE){指定日期格式}
format(Sys.Date(), format='%B %d %Y')
if(FALSE){時間間隔}
difftime(Sys.Date(), as.Date('2016-12-03'), units = 'days')
if(FALSE){轉化為日期格式}
egData$DATE <- as.Date(c('2016-01-01', '2016-02-01', '2016-03-01', '2016-04-01', '2016-05-01', '2016-06-01', '2016-07-01'))

這裡寫圖片描述

if(FALSE){型別判斷函式:is.numeric(),is.character(),is.vector(),is.matrix(),is.data.frame(),is.factor(),is.logical()...
型別轉化函式:as.numeric(),as.character(),as.vector(),as.matrix(),as.data.frame(),as.factor(),as.logical()...
}
is.numeric(c(1,2,3))
is.vector(c(1,2,3))
is.numeric(as.character(1))

這裡寫圖片描述

if(FALSE){資料排序,預設為升序,變數前面加-即為降序}
egData <- egData[order(egData$total, -egData$score1),]

這裡寫圖片描述

if(FALSE){資料集的合併}
if(FALSE){橫向合併資料框(資料集),merge()需要有共同變數,cbind()則不需要,已在上面程式碼展示過}
egData2 <- data.frame(ID=c(1,2,3,4,5,6,7), class=c(1,1,2,3,2,1,3))
x <- merge(egData, egData2, by='ID')
if(FALSE){縱向合併資料框(資料集),順序不必一樣,也可用於新增行,已在上面程式碼展示過}

這裡寫圖片描述

if(FALSE){選入變數}
newdata1 <- egData[c("ID","sex","age")]
newdata2 <- egData[,c(1:5)]
if(FALSE){刪除變數}
vars <- names(egData) %in% c('total','DATE')
newdata3 <- egData[!vars]
newdata4 <- egData[c(-7,-8)]

24
這裡寫圖片描述

if(FALSE){選入行或列}
mydata1 <- egData[which(egData$score1 > 60 & egData$score2 < 80),]
mydata2 <- mydata1[,1:3]
if(FALSE){選入行或列,利用subset()函式}
mydata3 <- subset(egData, score1 > 60 & score2 < 80, select = c(1:3))

26

if(FALSE){隨機抽樣,sample()函式}
mysample <- egData[sample(1:nrow(egData), 3 , replace = FALSE),]

這裡寫圖片描述

if(FALSE){利用SQL語句操作資料框,sqldf包}
library(sqldf)
mydata <- sqldf("SELECT ID, sex, ageType FROM egData WHERE score1 > 60 
                AND score2 < 80", row.names = TRUE)
print(mydata)

這裡寫圖片描述

if(FALSE){數學函式}
if(FALSE){絕對值}
abs(-4)
if(FALSE){平方根}
sqrt(25)
if(FALSE){不小於x的最小整數,ceiling(x)}
ceiling(3.475)
if(FALSE){不大於x的最大整數,floor(x)}
floor(3.475)
if(FALSE){向0方向擷取x中的整數部分,trunc(x)}
trunc(5.99)
if(FALSE){將x舍入為指定位數的小數,round(x)}
round(3.475, digits = 2)
if(FALSE){將x舍入為指定的有效數字位數,signif(x)}
signif(3.475, digits = 2)
if(FALSE){正弦sin(x),餘弦cos(x),正切tan(x)}
cos(2)
if(FALSE){反正弦asin(x),反餘弦acos(x),反正切atan(x)}
acos(-0.4161468)
if(FALSE){雙曲正弦sinh(x),雙曲餘弦cosh(x),雙曲正切tanh(x)}
sinh(2)
if(FALSE){反雙曲正弦asinh(x),反雙曲餘弦acosh(x),反雙曲正切atanh(x)}
asinh(3.62686)
if(FALSE){對x取以n為底的對數,log(x, base = n)}
log(8, base = 2)
if(FALSE){自然對數,log(x),常用對數,log10(x)}
log(10)
log10(10)
if(FALSE){指數函式,exp(x)}
exp(2.302585)
if(FALSE){將上述數學函式作用於數值向量、矩陣、資料框時,它們會獨立地作用於每個值}
sqrt(c(4,9,16))

29

if(FALSE){統計函式}
if(FALSE){在考慮以下統計函式時,應考慮它們的可選引數,如na.rm等,可使用help()檢視具體的函式使用}
z <- mean(c(1,2,3,4,5), trim = 0.5, na.rm = TRUE)
if(FALSE){平均數,mean(x)}
mean(c(1,2,3,4))
if(FALSE){中位數,median(x)}
median(c(1,2,3,4))
if(FALSE){標準差,sd(x)}
sd(c(1,2,3,4))
if(FALSE){方差,var(x)}
var(c(1,2,3,4))
if(FALSE){絕對中位差,mad(x)}
mad(c(1,2,3,4))
if(FALSE){絕對中位差,quantile(x,probs)}
quantile(c(1,2,3,4),c(0.25,0.5,0.75))
if(FALSE){值域,range(x)}
range(c(1,2,3,4))
if(FALSE){求和,sum(x)}
sum(c(1,2,3,4))
if(FALSE){滯後差分,diff(x,lag=n),lag用以指定滯後幾項,預設的lag值為1}
diff(c(1,2,3,4))
if(FALSE){最小值}
min(c(1,2,3,4))
if(FALSE){最大值}
max(c(1,2,3,4))
if(FALSE){為資料物件x按列進行中心化(center = TRUE)或標準化(center = TRUE, scale = TRUE)}
scaledata <- scale(egData[,4:6], center = TRUE, scale = TRUE)

這裡寫圖片描述

if(FALSE){概率函式}
if(FALSE){使用方法:[dqpr]distribution_abbreviation(),其中d為密度函式,p為分佈函式,q為分位數函式,r為生成隨機數,distribution_abbreviation()為概率分佈縮寫,詳見下表}
if(FALSE){繪製標準正態曲線}
x <- pretty(c(-3,3),100)
y <- dnorm(x)
plot(x,y,type="l",xlab="NormalDevite",ylab="Density",yaxs="i")
if(FALSE){位於z=1.96左側的標準正態曲線下方面積}
pnorm(1.96)
if(FALSE){均值為500,標準差為1000的正態分佈的0.9分位點值}
qnorm(0.9, mean = 500, sd = 1000)
if(FALSE){生成50個均值為50,標準差為10的正態隨機數}
rnorm(50, mean = 50, sd = 10)

這裡寫圖片描述

概率分佈縮寫表

分佈名稱 縮寫 分佈名稱 縮寫
Beta分佈 beta Logistic分佈 logis
二項分佈 binom 多項分佈 multinom
柯西分佈 cauchy 負二項分佈 nbinom
(非中心)卡方分佈 chisq 正態分佈 norm
指數分佈 exp 泊松分佈 pois
F分佈 f Wilcoxon符號秩分佈 signrank
Gamma分佈 gamma t分佈 t
幾何分佈 geom 均勻分佈 unif
超幾何分佈 hyper Weibull分佈 weibull
對數正態分佈 lnorm Wilcoxon秩和分佈 wilcox
if(FALSE){為生成隨機數指定種子,便於結果重現}
set.seed(5)
runif(5)
set.seed(1234)
runif(5)
if(FALSE){利用MASS包的mvrnorm(n, mean, sigma)函式生成多元正態分佈資料,其中n為樣本大小,mean為均值向量,sigma為方差-協方差矩陣(或相關矩陣)}
library(MASS)
options(digits = 3)
set.seed(1234)
mean <- c(230.7, 146.7, 3.6)
sigma <- matrix(c(15360.8, 6712.2, -47.1, 6721.2, 4700.9, -16.5, -47.1, -16.5, 0.3), nrow = 3, ncol = 3)
mydata <- mvrnorm(500, mean, sigma)
mydata<- as.data.frame(mydata)
names(mydata) <- c('y','x1','x2')
dim(mydata)
> head(mydata, n = 8)

這裡寫圖片描述

if(FALSE){字元處理函式}
if(FALSE){計算x中的字元數量,nchar(x)}
nchar(c('where','is','my','code'))
if(FALSE){提取或替換一個字元向量中的子串,substr(x, start, stop)}
x <- "abcdef"
substr(x,2,4)
substr(x,2,4) <- '2222'
if(FALSE){在x中搜索某種模式。grep(pattern, x, ignore.case = FALSE, fixed = FALSE),ignore.case表示是否忽略大小寫。若fixed = FALSE,則pattern為一個正則表示式。若fixed = TRUE, 在pattern為一個文字字串。返回值為匹配的下標}
grep("A", c("B","a","A","c"), ignore.case=FALSE, fixed=TRUE)
grep("^A", c("Bat","act","cow","AM"), ignore.case=FALSE, fixed=FALSE)
if(FALSE){在x中搜索pattern,並以文字replacement將其替換。若fixed =FALSE,則pattern為一個正則表示式。若fixed = TRUE, 在pattern為一個文字字串。}
sub("\\s","...","Hello China!", fixed = FALSE)
if(FALSE){在split處分割字元向量x中的元素。strsplit(x, split, fixed=FALSE)若fixed =FALSE,則pattern為一個正則表示式。若fixed = TRUE, 在pattern為一個文字字串。}
strsplit('I LIVE IN SHANGHAI!', ' ', fixed=TRUE)
if(FALSE){連線字串,分隔符為sep。paste(...,sep=...)}
paste("x", 1:5, sep="")
paste("x", 1:5, sep="L")
paste("C","Window","Files",sep="/")
if(FALSE){全部轉化為大寫}
toupper("China")
if(FALSE){全部轉化為小寫}
tolower("China")

這裡寫圖片描述

if(FALSE){其他實用函式}
if(FALSE){生成序列,seq(from, to, by),by為步長,預設為1}
seq(1,10)
seq(1,10,2)
if(FALSE){將x重複n次}
rep(1:3,2)
if(FALSE){將連續性變數分割為n個水平因子的變數,cut(x,n),使用選項ordered_result=TRUE可以建立有序性因子。}
cut(c(1,3,5,4,6),2)
cut(c(1,3,5,4,6),2,ordered_result = TRUE)
if(FALSE){pretty(x,n),通過選取n+1個等間距的取整值,將連續性變數分割為n個區間,繪圖中常用}
pretty(c(-3,3),30)
if(FALSE){cat(...,file="myfile",append=FALSE),連線...中的物件,並將其輸出到螢幕上或檔案中}
firstname <- c("Jane")
cat("Hello", firstname, "!")

這裡寫圖片描述

資料整合與重構

if(FALSE){t(x),矩陣或資料框的轉置}
cars <- mtcars[1:5,1:4]
t(cars)

這裡寫圖片描述

if(FALSE){aggregate(x, by, FUN),整合資料,x為待摺疊的物件,by是一個變數名組成的列表,FUN為用來計算描述性統計量的標量函式}
aggregate(mtcars, by=list(mtcars$gear), FUN=mean, na.rm=TRUE)

這裡寫圖片描述

if(FALSE){使用reshape包進行資料融合和重鑄}
if(FLASE){melt(),資料融合:每個測量變數獨佔一行,行中帶有要唯一確定這個測量變數所需的識別符號變數。}
md <- melt(mydata, id <- (c("id","time")))
if(FLASE){cast(md,formula,FUN),重鑄:讀取已融合的資料,並使用公式formula和函式FUN將其重塑。其中,formula的公式為:\n
    rowvar1+rowvar2+... ~  colvar1+colvar2+...
    '~'前定義了劃掉的變數,以確定各行的內容,"~"後定義了劃掉的列變數。
}
cast(md, id~variable, mean)
cast(md, time~variable, mean)

這裡寫圖片描述

if(FALSE){簡化程式碼:attach(),detach(),transform(),within(),with()函式的使用}
if(FALSE){attach(),detach()的使用,以原始egData為物件,新增兩列totalmean,分別表示score1,score2的總和和平均值}
attach(egData)
egData$total <- score1+score2
egData$mean <- (score1+score2)/2
detach(egData)
if(FALSE){transform(),實現同上的功能}
egData <- transform(egData, total=score1+score2, mean=(score1+score2)/2)
if(FALSE){within()with(),兩者類似,不同的是是否允許修改資料框。實現同上的功能}
egData <- within(egData,{
                 total=score1+score2
                 mean=(score1+score2)/2})

這裡寫圖片描述

if(FALSE){apply()函式,呼叫格式:
    apply(x, MARGIN, FUN, ...)
    其中,x為資料物件,MARGIN為維度的下標,FUN為指定函式,而...則包括了任何想傳遞給FUN的引數。在矩陣或資料框中,MARGIN=1表示行,MARGIN=2表示列。
}
if(FALSE){lapply(),sapply()函式,應用到列表(list)上。呼叫格式如下:
lapply(X, FUN, ...)
sapply(X, FUN, ..., simplify = TRUE, USE.NAMES = TRUE)}
x <- list(a = 1:10, beta = exp(-3:3), logic = c(TRUE,FALSE,FALSE,TRUE))
lapply(x, mean)
sapply(x, quantile)

names <- c("Jim Green","Alice Bell","Kent Brown")
split <- strsplit(names, " ")
sapply(split,"[",1)
sapply(split,"[",2)

這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述