簡體   English   中英

R中的函數,向量和循環

[英]Function, Vectors, and Loops in R

我最近開始嘗試使用R作為一種用於基因編程的語言。 我一直在緩慢而肯定地學習越來越多的有關R如何工作及其最佳編碼實踐的知識。 但是,我遇到了障礙。 這是我的情況。 我有一個大約700行的數據集,每行有400左右列。 我進行了所有設置,將具有與列數相同的多個參數的函數作為參數發送到評估(適應性評分)函數中。 我想在數據集中逐行並將行中每一列中的值傳遞給要評估的函數。 第一個問題是弄清楚如何將參數分別傳遞給函數。 “分別”是指該函數需要400個參數,而不是長度為400的向量。為此,我使用了以下命令:

do.call(function,as.list(parameters))

其中parameter是月份變量(1-12)的向量,該變量附加到數據集中一行中的值。 效果很好,我只使用了一個for循環對數據集中的700行進行迭代,然后對12個月進行了另一個循環,並使用上述累積了輸出向量。 問題是這非常緩慢,每個功能大約需要24-28秒。 每一代我都有100-500個函數發送到此評估中。 最重要的是這不是要走的路。 接下來,我嘗試使用如下的sapply方法。

outputs <- sapply(1:12,function(m) sapply(rows[1:length(rows)],function(p) do.call(f,as.list(c(p,m)))))

這應用(1-12)作為月份,然后應用(1-700)作為數據集的行。 這花了很長時間。 關於解決方案的任何想法都會有所幫助。

這種情況下的主要問題通常是您采用的方法是錯誤的。 我對您的具體情況還不了解,但是:

  1. 嘗試對計算進行向量化-因此您的函數應在所有行上運行,而不是一次只運行一次。
  2. 如果僅將數字存儲在data.frame中,則將其轉換為矩陣通常會加快許多操作。
  3. 不要編寫帶有400個參數的函數! 5也可能偏高。

編輯由於生成了函數,因此您應該能夠生成采用值向量而不是那么多參數的不同版本。 請注意,您傳遞的向量可以具有名稱:

# Convert this:
f <- function(foo, bar) {
  foo+bar
}
do.call(f, list(foo=42, bar=13))

# To this:
f <- function(args) {
  args[["foo"]] + args[["bar"]] 
  # or even faster:
  #args[[0]] + args[[1]]
  # or fastest:
  #sum(args)
}
do.call(f, list(args=c(foo=42, bar=13)))
# or, simply
f(c(foo=42, bar=13))

...用1個參數而不是400調用一個函數快60倍 但是請注意,這只是調用該函數的開銷。 您還需要測量實際功能需要花費多少時間。 如果那需要一秒鍾或更長時間,那么調用它的效率或循環的效率都無所謂...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM