首页 > 解决方案 > 如何使用 R 数据框中的数据从 R 脚本中调用 python 脚本并将结果添加到新列

问题描述

我想使用一个python程序,我可以在命令行中从R脚本中调用它,然后为数据框中的每一行调用该程序,将结果添加到数据框中,然后将数据框导出为.tsv 数据。

我的例子是这样的:我有一个数据框,其中第 2 列中有一个字符串 (amino_acid),我想在第 2 列中的每个字符串上调用程序“olga-compute_pgen”,并从“olga- compute_pgen" 到数据框中的新列。

我在终端中的命令(我使用 MacOS)将是

olga-compute_pgen --humanTRB(这里是字符串)

输出的一个例子是:

olga-compute_pgen --humanTRB CASSLGRDGGHEQYF

这导致了这个输出:

氨基酸序列 CASSLGRDGGHEQYF 的 Pgen:7.253421763151433e-10

完成 pgen 计算:0.05 秒。

我想在我的数据框中添加一列并用 python 结果填充它的代码行现在是

df <- cbind(df,NewColumn=(system('olga-compute_pgen --humanTRB') df[,2], wait=FALSE))

但这显然根本不起作用。

感谢您的帮助,在此先感谢。

编辑:

在一些帮助之后,我已经完成了一些工作,我会在这里发布进度,因为代码更容易阅读:

system2 似乎是一个好的开始,因为我可以给出一个带有参数的命令,然后将其输出到数据框中以进一步编辑:

我现在还有两个问题:

  1. 此行不能使用先前数据帧的值作为命令的附加输入,而是使用字符串

    olga <- system2('olga-compute_pgen' , args="--humanTRB ", input=x, wait=TRUE, stdout=TRUE)

  2. 然后应将输出(一旦我得到输入工作)附加到新列中的原始数据框

感谢您的帮助!

编辑2:解决方案

我已经将它与“system2”和“foreach”的组合一起使用,这是我最后所做的:

#dataframe is df
#first define the function to use (in this case olga from python)
olgafunction <- function(y) {
    olga <- system2('olga-compute_pgen', args=c("--humanTRB ",
        as.character(y[,2])), wait=TRUE, stdout=TRUE)
    y <- cbind(y, pgen=olga)
    }
#now use this function for every row of the dataframe
dfoutput <- foreach(dfrow=iter(df, by='row'), .combine=rbind) %do%
    olgafunction(dfrow)

标签: pythonr

解决方案


为之前评论中迟到的回复和严厉的语气道歉。我试图帮助你学习调试你的问题,你现在已经成功了。system返回可执行文件的退出状态system您可以从-function的文档中阅读此内容( https://stat.ethz.ch/R-manual/R-devel/library/base/html/system.html)。所有程序都返回一个退出状态(通常为 0 表示成功终止),这与它输出到屏幕的内容完全不同。

但是,我建议您看一下该功能system2,它应该更加坚固和灵活。看看stdout参数的使用,这将是解决您的问题的关键。


推荐阅读