引用变量列表以在r中进行计算

时间:2014-06-20 14:02:48

标签: r loops

我试图计算5个变量s1 vs s3,s1 vs s4,s1 vs s5,s2 vs s3,s2 vs s4,s2 vs s5

的字符串之间成对差异的数量
s1 <- unlist(strsplit('TGTAGCAACGGATTCCACCCATATGGGCTCAGCAGGCAGGTCCTGGATTGTTTGCT',''))
s2 <- unlist(strsplit('TGTAACAACGAATTCCATCCATATGGGCTCAGCAGGCAGGTCCTGGACTATTTGCT',''))

s3 <- unlist(strsplit('TGTAACGATGGGTCCTGCTTACGCGGGTTCAGTAGGTAAATTCTAGGCCGCCTATT',''))
s4 <- unlist(strsplit('TGTAACAACGGATTCCACCCATATGGGCTCAGCAGGCAGGTCCTGGACTGTTTGCT',''))
s5 <- unlist(strsplit('TGTAACGACGGGCCCTGCTTACGCGGGTTCAGTAGGTAAATTCTGGGCCGCTTATT',''))

for(i in 1:2)
{
  for(j in 3:5){
  diff(i.j) <- sum(mapply(function(x,y) sum(x!=y),s(i),s(j)))
  }
}

3 个答案:

答案 0 :(得分:0)

s(i)无法使用你可能会尝试

  

的get(粘贴( “S”,I,九月= “”))

你的diff(i.j)也有同样的问题。您可以调用您的对象diff_i.j或其他任何东西,但不能使用括号。

答案 1 :(得分:0)

因此,保持你的变量和风格,我想你想要这样的东西:

s1 <- unlist(strsplit('TGTAGCAACGGATTCCACCCATATGGGCTCAGCAGGCAGGTCCTGGATTGTTTGCT',''))
s2 <- unlist(strsplit('TGTAACAACGAATTCCATCCATATGGGCTCAGCAGGCAGGTCCTGGACTATTTGCT',''))

s3 <- unlist(strsplit('TGTAACGATGGGTCCTGCTTACGCGGGTTCAGTAGGTAAATTCTAGGCCGCCTATT',''))
s4 <- unlist(strsplit('TGTAACAACGGATTCCACCCATATGGGCTCAGCAGGCAGGTCCTGGACTGTTTGCT',''))
s5 <- unlist(strsplit('TGTAACGACGGGCCCTGCTTACGCGGGTTCAGTAGGTAAATTCTGGGCCGCTTATT',''))

strList <- rbind(s1,s2,s3,s4,s5)
diff <- matrix(nrow=2, ncol=3)
for(i in 1:2) {
  for(j in 1:3) {
    diff[i,j] <- sum(strList[i,] != strList[j+2,])
  }
}

答案 2 :(得分:0)

虽然您可以在循环中使用get来检索变量,但最好将数据放入某个结构中。

在这里,您有两个逻辑结构,而不是一个,而您正在制作两个集合的外部产品。 outer对外部产品很有用,它要求两个逻辑输入是单独的对象。

以下是您要比较的两个向量:

a <- c('TGTAGCAACGGATTCCACCCATATGGGCTCAGCAGGCAGGTCCTGGATTGTTTGCT',
       'TGTAACAACGAATTCCATCCATATGGGCTCAGCAGGCAGGTCCTGGACTATTTGCT')

b <- c('TGTAACGATGGGTCCTGCTTACGCGGGTTCAGTAGGTAAATTCTAGGCCGCCTATT',
       'TGTAACAACGGATTCCACCCATATGGGCTCAGCAGGCAGGTCCTGGACTGTTTGCT',
       'TGTAACGACGGGCCCTGCTTACGCGGGTTCAGTAGGTAAATTCTGGGCCGCTTATT')

这是base中的一个表达式,它在函数中进行字符串分割。传递给outer的函数必须进行矢量化,因此mapply用于循环数据:

outer(a, b, FUN=function(a, b) 
                mapply(function(x, y)
                       sum(strsplit(x, '')[[1]] != strsplit(y, '')[[1]])
                       , a, b
                )
)
     [,1] [,2] [,3]
[1,]   26    2   24
[2,]   27    3   25

计算的是字符串对之间的汉明距离。包stringdist使得它更具可读性(并且可能更快):

outer(a, b, FUN=stringdist, method='hamming')
     [,1] [,2] [,3]
[1,]   26    2   24
[2,]   27    3   25

stringdist的作者预测你会想要这样做,所以提供了一个功能:

stringdistmatrix(a, b, method="hamming")