如何使用 proxy::dist 应用自定义函数来在 R 中创建距离矩阵

发布于 2025-01-09 20:18:54 字数 1693 浏览 1 评论 0 原文

我定义了一个自定义函数并测试了该函数以确保它有效,但我无法将其应用于列表以获得距离矩阵。

我的代码是:

library(Biostrings)
library(proxy)

#import the sequences using Biostrings
indf<-readAAStringSet("C:/Users/jamie/OneDrive/Documents/Junk/SAMPLEFASTA.fasta")

#Assign the names and sequences to different variables
seqAAname<-names(indf)
seqz<-paste(indf)

#Put just the sequences into a dataframe
indf2<-data.frame(seqz)

#Convert the sequences into a list
indf3<-as.list(indf2)

#Define a custom function to return the alignment score between two sequences (pairwise)
customalnfunc <- function(X, Y){
  pairwiseAlignment(X, Y,
                    substitutionMatrix = "BLOSUM45", gapOpening = 1, gapExtension = 3)
}

#Test the function but not as a function (This works fine)
testfreefunc<-  pairwiseAlignment(AAString("PEHQRSTVE"),AAString("PQHQRETVE"),
                    substitutionMatrix = "BLOSUM45", gapOpening = 1, gapExtension = 3)
print(testfreefunc@score)


#Test the function as a fucntion to make sure it works (This works fine)
testfuncout <- customalnfunc(AAString("PEHQRSTVE"),AAString("PQHQRETVE"))
print(testfuncout@score)

#Apply the custom function to all possible pairs using proxy::dist with the custom function (This does not work, it returns 0)
outalnmatrix <- proxy::dist(indf3, method = customalnfunc)
outalnmatrix

SAMPLEFASTA.fasta 文件包含:

>SeqA
PEHQRSTVE
>SeqB
PQHQRETVE
>SeqC
RQHERSEVE

outalnmatrix 所需的输出是: 输入图片这里的描述

我尝试将输入数据作为列表和矩阵传递给 proxy::dist 。

我怎样才能做到这一点?

I have defined a custom function and tested the function to make sure that it works but I am unable to apply it to a list in order to obtain a distance matrix.

The code I have is:

library(Biostrings)
library(proxy)

#import the sequences using Biostrings
indf<-readAAStringSet("C:/Users/jamie/OneDrive/Documents/Junk/SAMPLEFASTA.fasta")

#Assign the names and sequences to different variables
seqAAname<-names(indf)
seqz<-paste(indf)

#Put just the sequences into a dataframe
indf2<-data.frame(seqz)

#Convert the sequences into a list
indf3<-as.list(indf2)

#Define a custom function to return the alignment score between two sequences (pairwise)
customalnfunc <- function(X, Y){
  pairwiseAlignment(X, Y,
                    substitutionMatrix = "BLOSUM45", gapOpening = 1, gapExtension = 3)
}

#Test the function but not as a function (This works fine)
testfreefunc<-  pairwiseAlignment(AAString("PEHQRSTVE"),AAString("PQHQRETVE"),
                    substitutionMatrix = "BLOSUM45", gapOpening = 1, gapExtension = 3)
print(testfreefunc@score)


#Test the function as a fucntion to make sure it works (This works fine)
testfuncout <- customalnfunc(AAString("PEHQRSTVE"),AAString("PQHQRETVE"))
print(testfuncout@score)

#Apply the custom function to all possible pairs using proxy::dist with the custom function (This does not work, it returns 0)
outalnmatrix <- proxy::dist(indf3, method = customalnfunc)
outalnmatrix

The SAMPLEFASTA.fasta file contains:

>SeqA
PEHQRSTVE
>SeqB
PQHQRETVE
>SeqC
RQHERSEVE

The desired output from outalnmatrix is:
enter image description here

I have tried passing the input data to proxy::dist as a list and a matrix.

How can I make this work?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

夜光 2025-01-16 20:18:54

您不需要使用 proxy 包,因为 proxy::dist 旨在对矩阵/数据帧的行进行相互比较。由于要比较字符串,因此可以使用outer。但是,您需要调整 customalnfunc 函数,以便它仅返回一个数字 (scoreOnly = TRUE)。

library(Biostrings)

seqz <- c("PEHQRSTVE", "PQHQRETVE", "RQHERSEVE")

customalnfunc <- function(X, Y){
  pairwiseAlignment(X, Y,
                    substitutionMatrix = "BLOSUM45",
                    gapOpening = 1,
                    gapExtension = 3,
                    scoreOnly = TRUE)
}

outer(seqz, seqz, customalnfunc)

#>
     [,1] [,2] [,3]
[1,]   58   50   33
[2,]   50   60   33
[3,]   33   33   57


You don't need to use the proxy package as proxy::dist is meant to icompare rows of matrix/dataframes against each other. Since you want to compare strings, you can use outer. However, you need to tweak your customalnfunc function, so that it returns only a number (scoreOnly = TRUE).

library(Biostrings)

seqz <- c("PEHQRSTVE", "PQHQRETVE", "RQHERSEVE")

customalnfunc <- function(X, Y){
  pairwiseAlignment(X, Y,
                    substitutionMatrix = "BLOSUM45",
                    gapOpening = 1,
                    gapExtension = 3,
                    scoreOnly = TRUE)
}

outer(seqz, seqz, customalnfunc)

#>
     [,1] [,2] [,3]
[1,]   58   50   33
[2,]   50   60   33
[3,]   33   33   57


~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文