2013-03-08 58 views
0

我有A R這樣的代碼:如何繼續將以下R代碼轉換爲Python?

compute_enrichment <- function(dz_vec) { 
     dz_vec <- dz_vec[!is.na(dz_vec)] 
     n_module_genes <- length(intersect(module_genes,names(dz_vec))) 
     module_genes_pct <- n_module_genes/length(module_genes) 
     result <- list(escore=NA,norm_escore=NA,pvalue=NA,pct_module_genes=module_genes_pct) 
     if (module_genes_pct >= MIN_PCT_MODULE_GENES) { 
      result$escore <- abs(sum(dz_vec[module_genes],na.rm=T)) 
      rand_escores <- sapply(1:N_PERMUTATIONS, function(i) { 
       abs(sum(sample(dz_vec,n_module_genes),na.rm=T)) 
      }) 
      result$norm_escore <- (result$escore - mean(rand_escores))/sd(rand_escores) 
      result$pvalue <- length(which(rand_escores > result$escore))/length(rand_escores) 
     } 
     result 
    } 

我想這個代碼轉換爲Python的。是否有某種腳本可用於此?小小的頭腦開始將是偉大的。由於

+0

其中'module_genes'變量來自? – leodido 2013-03-08 21:41:24

+0

首先編寫一些測試腳本,以便知道給定輸入的期望輸出。然後你可以檢查你的Python轉換是否與你的R版本做同樣的事情。當然,隨着一些隨機抽樣(sample()函數),你可能會有一些樂趣... – Spacedman 2013-03-09 00:25:35

回答

4

一般翻譯問題會很困難(而且我不知道任何自動翻譯機制),並且其他人提出的使用rpy的建議是非常好的。

但是,如果您確實需要將此特定代碼轉換爲Python,則該代碼的作業會更容易,因爲它不包含許多矢量化操作。使用一個模式是:

  1. 類似的代碼dz_vec <- dz_vec[!is.na(dz_vec)]成爲一個列表理解(雖然你得有什麼用的NA,這並不在Python存在,因而辦法公約測試這種情況)。
  2. length()變成len()
  3. sapply成爲列表理解。
  4. meansd這樣的函數可以在numpy中找到(或者很容易寫出自己)。
+0

+1實際回答問題:) – BenDundee 2013-03-08 21:54:12

3

我回答這個問題,蟒蛇把它永遠是:scriptify它,然後調用使用subprocess蟒蛇腳本。我喜歡這種方法(而不是安裝RPy),因爲RPy不適用於所有版本的R(這意味着如果你沒有幸運地使用正確的版本來重新創建你的安裝),你就不必安裝任何如果你的R腳本已經運行。

+2

+1,將R作爲腳本調用是一個不錯的簡單界面。然而,如果你需要經常調用這個函數,並且在R和Python之間來回傳輸數據,比如說在一個優化例程中,這會變得非常緩慢和麻煩。 – 2013-03-08 21:51:08