R语言数据的排序、转换、汇总
生活随笔
收集整理的這篇文章主要介紹了
R语言数据的排序、转换、汇总
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
R學習筆記4_初級
- 數據排序
- sort函數
- rank函數
- order函數
- 數據轉換
- 長寬型數據轉換
- stack函數
- tapply函數
- reshape函數
- reshape2函數
- 變量因子化(連續變量離散化)
- 數據匯總
- apply家族
- apply函數
- lapply函數
- sapply函數
- tapply函數
- mapply函數
- ave函數
- by函數
- aggregate函數
- sweep函數
本系列為R語言系統學習筆記,已收錄至“R語言筆記”專欄,可戳右下角專欄目錄訂閱,空余時間會持續更新。往期文章:
0. R的下載與安裝 vs Rstudio報錯
1. R語言向量、矩陣、數組、數據框
2. R語言條件、循環、函數
3. R語言數據的讀取與導出
數據排序
sort函數
x <- sample(1:100,10) sort(x, decreasing = T) #默認是從小到大排序 y <- c('python','ruby','java','r') sort(y,decreasing = T) #[1] "ruby" "r" "python" "java"rank函數
rank(x) #秩次排序,生成變量的秩次排名 z <- c(1,2,3,3,4,4,5,6,6,6,7,8,8) rank(z) #結果出現了小數,當rank識別到相同的元素,會取元素秩次均值order函數
x #[1] 39 97 31 83 56 1 19 60 50 41 order(x) #[1] 6 7 3 1 10 9 5 8 4 2 返回的是元素下標 x[order(x)] #下標再傳入x即可生成排序 [1] 1 19 31 39 41 50 56 60 83 97 head(iris) head(iris[order(iris$Sepal.Length,decreasing = T),]) #按Sepal.Length列從大到小的順序排列 head(iris[order(-iris$Sepal.Length),]) #加負號也可按從大到小的順序排列 #對多個變量進行排序 head(iris[order(iris$Sepal.Length, iris$Sepal.Width),]) #先對Sepal.Length排序(從小到大),在此基礎上對Sepal.Width排序數據轉換
長寬型數據轉換
stack函數
freshmen <- c(178,180,182,180) sophomores <- c(188,172,175,172) juniors <- c(167,172,177,174) data.frame(fr = freshmen, so = sophomores, ju = juniors) #結果如下 #結果如下,此時是寬型數據 '''fr so ju 1 178 188 167 2 180 172 172 3 182 175 177 4 180 172 174 ''' height <- stack(list(fresh = freshmen, sopho = sophomores, jun = juniors)) height #運用stack函數,將原本的數據堆棧為長型數據 #結果如下 '''values ind 1 178 fresh 2 180 fresh 3 182 fresh 4 180 fresh 5 172 fresh 6 188 sopho 7 172 sopho 8 175 sopho 9 172 sopho 10 167 jun 11 172 jun 12 177 jun 13 174 jun '''tapply函數
tapply(height$values, height$ind, mean) #轉換為長型數據后,可直接用tapply函數求各自統計量 #用tapply求統計量 ''' fresh sopho jun 178.40 176.75 172.50 '''reshape函數
View(Indometh) #Indometh是一個長型數據 summary(Indometh) #輸出Indometh的描述統計量 wide <- reshape(Indometh, v.names = 'conc', idvar = 'Subject', timevar = 'time', direction = 'wide') #v.names將哪個變量作為value,idvar指標識變量是哪個,timevar作為列 View(wide) long <- reshape(wide, v.names = 'conc', idvar = 'Subject', varying = list(2:12), direction = 'long') #varying = list(2:12)將2到12列堆棧到一起 View(long)reshape2函數
- 加載reshape2包
- 使用melt函數
- 計算指標均值
- 實例:小費tips數據集
變量因子化(連續變量離散化)
age <- sample(20:80, 20) age- 方法一 (公式法,True=1,False=0)
- 方法二(cut函數)
- 方法三(if else)
- 方法四(car)
數據匯總
apply家族
apply函數
mat <- matrix(1:24, nrow = 4, ncol = 6) apply(mat, 1, sum) #計算行和 #注釋:第二個指標為margin,1代表行,2代表列 apply(mat, 1, mean) #計算每一行均值 apply(mat, 2, mean) #計算每一列均值 apply(iris[,1:4],2,mean) #計算iris中1:4列均值lapply函數
lapply(X = c(1:5),FUN = log) #對X遍歷,都返回log lapply(iris[,1:3], function(x)lm(x~iris$Sepal.Width,data = iris[,1:3]))#iris數據集前三列與Sepal.Width列進行回歸- lapply用于以list為結果返回的函數,適用于返回線性回歸結果。
sapply函數
sapply(1:5,log) #返回向量、矩陣、數據框 sapply(1:5,function(x)x+3)tapply函數
tapply(X = iris$Sepal.Length,INDEX = iris$Species, FUN = mean)#根據Species將Sepal.Length切分,分別計算均值- tapply只適用于數據框
mapply函數
myfun <- function(x,y){if(x>4)return(y)else return(x+y) } myfun(1:5, 2:6) #此時會報錯:Error in if (x > 4) return(y) else return(x + y) : the condition has length > 1,因為if無法進行向量化操作 mapply(myfun, 1:5,2:6) #而使用mapply就具有向量化操作功能ave函數
survival <- data.frame(id = 1:10, cancer = sample(c('lung','liver','colon'),10,replace = T),treatment = sample(c('Surg','Chemo'),10,replace = T),sur_days = sample(100:1000,10)) survival ave(survival$sur_days,survival$cancer)#求不同分類水平(cancer)的(sur_days)均值 ave(survival$sur_days,survival$cancer,FUN = sd)#求不同分類水平(cancer)的(sur_days)標準差by函數
by(data = survival$sur_days,INDICES = survival$cancer,FUN = mean)#求不同分類水平的均值(簡潔) by(data = survival$sur_days,INDICES = list(survival$cancer,survival$treatment),FUN = mean)aggregate函數
data(mtcars) View(mtcars) aggregate(x = mtcars,by = list(VS = mtcars$vs==1, high = mtcars$mpg > 22),mean) aggregate(x = mtcars[,1:4],by = list(VS = mtcars$vs==1, high = mtcars$mpg > 22),mean) aggregate(iris,by = list(high_sp = iris$Sepal.Length>5,hige_sw = iris$Sepal.Width > 3.5),mean) #字符串類會警告,數值型可直接求出 aggregate(.~Species,data = iris,mean)by(mtcars,mtcars$cyl,function(x)lm(mpg~disp + hp, data = x))#自定義函數進行線性回歸sweep函數
#針對數組 my_array <- array(1:24, dim = c(3,4,2)) my_array sweep(x = my_array, MARGIN = 1, STATS = 1, FUN = '+') #對于my_array每行元素+1 #MARGIN取行,默認是減法‘-’運算- cr.Leopard課程
總結
以上是生活随笔為你收集整理的R语言数据的排序、转换、汇总的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 4g运行内存手机还能用多久_8G运存手机
- 下一篇: 2009年第一天上班,祝大家工作顺利!