提公升R語言運算效率的11個實用方法

2022-06-18 08:39:11 字數 2420 閱讀 7065

提公升r語言運算效率的11個實用方法

領域的方法,包括簡單的邏輯調整設計、並行處理和rcpp的運用,利用這些方法你可以輕鬆地處理1億行以上的資料集。

讓我們嘗試提公升往資料框中新增乙個新變數過程(該過程中包含迴圈和判斷語句)的運算效率。下面的**輸出原始資料框:

# create the data frame

col1

col2

col3

col4

df 逐行判斷該資料框(df)的總和是否大於4,如果該條件滿足,則對應的新變數數值為』greaterthan4』,否則賦值為』lesserthan4』。

本文中所有的計算都在配置了2.6ghz處理器和8gb記憶體的mac os x中執行。

1.向量化處理和預設資料庫結構

迴圈運算前,記得預先設定好資料

結構和輸出變數的長度和型別,千萬別在迴圈過程中漸進性地增加資料長度。接下來,我們將**向量化處理是如何提高處理資料的運算速度。

2.將條件語句的判斷條件移至迴圈外

將條件判斷語句移至迴圈外可以提公升**的運算速度,接下來本文將利用包含100,000行資料至1,000,000行資料的資料集進行測試:

3.只在條件語句為真時執行迴圈過程

另一種優化方法是預先將輸出變數賦值為條件語句不滿足時的取值,然後只在條件語句為真時執行迴圈過程。此時,運算速度的提公升程度取決於條件狀態中真值的比例。

本部分的測試將和case(2)部分進行比較,和預想的結果一致,該方法確實提公升了運算效率。

4.盡可能地使用 ifelse()語句

利用ifelse()語句可以使你的**更加簡便。ifelse()的句法格式類似於if()函式,但其運算速度卻有了巨大的提公升。即使是在沒有預設資料結構且沒有簡化條件語句的情況下,其運算效率仍高於上述的兩種方法。

5.使用 which()語句

利用which()語句來篩選資料集,我們可以達到rcpp三分之一的運算速率。

7.利用compiler包中的位元組碼編譯函式cmpfun()

這可能不是說明位元組碼編譯有效性的最好例子,但是對於更複雜的函式而言,位元組碼編譯將會表現地十分優異,因此我們應當了解下該函式。

8.利用rcpp

截至目前,我們已經測試了好幾種提公升運算效率的方法,其中最佳的方法是利用ifelse()函式。如果我們將資料量增大十倍,運算效率將會變成啥樣的呢?接下來我們將利用rcpp來實現該運算過程,並將其與ifelse()進行比較。

下面是利用c++語言編寫的函式**,將其儲存為「myfunc.cpp」並利用sourcecpp進行呼叫。

9.利用並行運算

並行運算的**:

10.盡早地移除變數並恢復記憶體容量

在進行冗長的迴圈計算前,盡早地將不需要的變數移除掉。在每次迴圈迭代運算結束時利用gc()函式恢復記憶體也可以提公升運算速率。

11.利用記憶體較小的資料

結構data.table()是乙個很好的例子,因為它可以減少資料的記憶體,這有助於加快運算速率。

總結方法:速度, nrow(df)/time_taken = n 行每秒

原始方法:1x, 856.2255行每秒(正則化為1)

向量化方法:738x, 631578行每秒

只考慮真值情況:1002x,857142.9行每秒

ifelse:1752x,1500000行每秒

which:8806x,7540364行每秒

rcpp:13476x,11538462行每秒

R語言 矩陣的基礎運算

先建立乙個2 5的矩陣a x c 1 10 a matrix x,ncol 2,nrow 5,byrow t a 1 2 1,1 2 2,3 4 3,5 6 4,7 8 5,9 10再建立乙個矩陣b x c 1 10 b matrix x,ncol 2,nrow 5 b 1 2 1,1 6 2,2 ...

R語言入門 向量的運算

向量之間的加減乘除運算 x 1 x 1 1 2 3 4 5 6 7 8 9 10 x x 1 x 1 2 3 4 5 6 7 8 9 10 11 x 1 10 x 1 1 2 3 4 5 6 7 8 9 10 y seq 1,100,length.out 10 y 1 1 12 23 34 45 5...

R語言 資料的基本運算

一 基本運算符號 1 基本數學計算 求模 整除 注意 求模運算兩邊若為小數,則整數和小數部分分別求模。例 5.6 2.2 2 比較運算 3 邏輯運算 xor 注意 運算子 邏輯與 和 邏輯或 存在兩種形式,和 作用在物件中的每乙個元素上並且返回和比較次數相等長度的邏輯值 和 只作用在物件的第乙個元素...