2013-03-08 25 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