日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

R语言中dim函数_R语言--向量化计算(apply族函数)

發布時間:2025/3/8 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 R语言中dim函数_R语言--向量化计算(apply族函数) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

R語言最優秀的是它的向量化編程,這其中apply族函數扮演了非常重要的角色。apply族函數是由apply、sapply、lapply、mapply、tapply等函數組成的。熟練使用apply族函數,能夠簡化程序,提高代碼的運算速度。

軟件&環境

  • win10 64bit
  • R 3.6.1

apply

apply是最基本的函數。為了方便演示,選取了R自帶的數據框mtcars的前4行和前5列,并賦值給data。a1返回的結果是data數據每一行的和,由于每行都有一個和,所以a1是4個元素組成的數值向量。a2返回的結果是data數據每一列的均值,同樣,a2是5個元素組成的數值向量。

# 獲取內置數據 data <- mtcars[1:4,1:5] print(data) ## mpg cyl disp hp drat ## Mazda RX4 21.0 6 160 110 3.90 ## Mazda RX4 Wag 21.0 6 160 110 3.90 ## Datsun 710 22.8 4 108 93 3.85 ## Hornet 4 Drive 21.4 6 258 110 3.08 # 對數據框每行求和 a1 <- apply(data,1,sum) print(a1) ## Mazda RX4 Mazda RX4 Wag Datsun 710 Hornet 4 Drive ## 300.90 300.90 231.65 398.48 # 對數據框每列求均值 a2 <- apply(data,2,mean) print(a2) ## mpg cyl disp hp drat ## 21.5500 5.5000 171.5000 105.7500 3.6825

apply函數的第一個參數表示數據,第二個參數表示維度(1表示行,2表示列),第三個參數表示在維度上操作的函數。需要注意的是第三個參數,用作演示的函數是R自帶的函數(sum、mean),當然,這里也可以是自己定義的函數。

# 自定義函數(求極差) func <- function(x){result <- diff(range(x))return(result) } # 對數據框每列求極差 a3 <- apply(data,2,func) print(a3) ## mpg cyl disp hp drat ## 1.80 2.00 150.00 17.00 0.82

sapply

sapply的用法比apply要更靈活一些,同樣,用data做演示。計算數據框data每列的數據范圍,用sapply進行計算,返回的結果存儲在s1里,sapply第一個參數是需要計算的數據框,第二個參數是函數,第三個參數simplify=T(默認)代表返回的結果簡化表示,s1的數據格式為矩陣。

s1 <- sapply(data,range,simplify = T) class(s1) ## [1] "matrix"

如果不想讓計算的結果自動合并成矩陣,可以設置simplify=F,將返回一個列表,列表的每個組件包含了data數據框每列的range函數計算結果。

s2 <- sapply(data,range,simplify = F) class(s2) ## [1] "list"

sapply一個更常見的用法是針對列表的組件進行操作。例如有n個數據框,對每個數據框都要進行相同的操作,常規方法用循環遍歷,但操作體驗差,速度慢,更優的解決方案是:先對單個數據框定義處理函數,然后用sapply對所有數據框采取相同操作。

# 定義一個數據框組成的list df_list <- list(a=mtcars[1:3,1:4],b=airquality[1:3,1:4],c=iris[1:3,1:4]) # 自定義函數(求數據框歐氏距離的最大值) max_func <- function(x){d <- dist(x,p=2)return(max(d)) } # sapply對每個數據框計算 s3 <- sapply(df_list,max_func) print(s3) ## a b c ## 54.7744466 72.3488770 0.5385165

lapply

lapply的用法與sapply基本相同,只不過返回的結果是以list儲存的。

# 求每一列的均值 l1 <- lapply(data,mean) print(l1) ## $mpg ## [1] 21.55 ## ## $cyl ## [1] 5.5 ## ## $disp ## [1] 171.5 ## ## $hp ## [1] 105.75 ## ## $drat ## [1] 3.6825 class(l1) ## [1] "list"

mapply

mapply在sapply和lapply的基礎上進行了拓展,可以應用在多個變量上。a、b、c三個數值向量,第一次需要計算1*2*3,第二次需要計算2*3*4,...,以此類推。當需要每次變化的變量有多個時,用mapply計算更方便快捷。

a <- 1:5 b <- 2:6 c <- 3:7 m1 <- mapply(prod,a,b,c) print(m1) ## [1] 6 24 60 120 210

tapply

tapply主要用在分組計算上。分組計算是常見的數據處理操作,能夠處理分組計算的函數也不少,tapply的優勢是簡單便捷。

# 數據框 group_df <- data.frame(value=1:6,label=rep(c("a","b"),3,each=1)) print(group_df) ## value label ## 1 1 a ## 2 2 b ## 3 3 a ## 4 4 b ## 5 5 a ## 6 6 b # 按照label分組計算value和 t1 <- tapply(X =group_df$value,INDEX = group_df$label,sum) print(t1) ## a b ## 9 12

http://weixin.qq.com/r/mShLU4rECNd3rc4w932L (二維碼自動識別)

總結

以上是生活随笔為你收集整理的R语言中dim函数_R语言--向量化计算(apply族函数)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。