多变量应用函数来成对地比较一组文件

时间:2013-08-14 18:01:37

标签: r

我有一个向量,其中包含名为c("tom.txt", "tim.txt" , "Amy.txt")的数据向量名称。我的任务是:构建一个对称矩阵,最后看起来如下所示。

> m
        tom.txt tim.txt amy.txt
tom.txt       0      10       5
tim.txt      10       0       7
amy.txt       5       7       0

条目由名为get.result(vec1, vec2)的函数获取,该函数查找目录中2个文本文件的相应数据向量,并对它们执行一些操作,然后为矩阵中的每个位置返回一个值。例如,如果我想获得条目m["tom.txt", "tim.txt"],我需要将“tom.txt”和“tim.txt”传递给get.result("tom.txt", "tim.txt")。这个功能的内容并不重要。

但是,如果我想计算所有条目的值,那么继续输入get.result("tom.txt", "amy.txt"), get.result("tim.txt", "amy.txt")将非常繁琐,尤其是当我实际使用100个不同的文本文件时。

我的问题:是否有一种有效的方法来编程,以便我总是将一个文本文件与其余的(从不与自身进行比较)进行比较,同时,我可以跟踪他们在矩阵中的位置?

我应该在开头使用全零来初始化矩阵,并将列名和行名设置为文本文件名吗?但在这种情况下,我不知道如何获取列名和行名,以便我可以将它们传递给get.result(vec1, vec2)

4 个答案:

答案 0 :(得分:3)

试试这个解决方案

fn <- c("tom.txt", "tim.txt" , "Amy.txt")

n <- length(fn)

m <- matrix(0, n, n)

rownames(m) <- fn
colnames(m) <- fn

for (i in 1:n) for (j in i:n) if (i!=j) {
  v <- get.result(fn[i], fn[j])
  m[i,j] <- v
  m[j,i] <- v
}

m

答案 1 :(得分:1)

fn = dir(pattern=".txt")(如果需要,可以更改模式)将为您提供目标文件夹中的文本文件。然后,您可以像上一个答案一样遍历该列表。

答案 2 :(得分:0)

combn函数为您提供了不同的向量元素组合:

combs <-combn( c("tom.txt", "tim.txt" , "Amy.txt") , 2)
#----------------
     [,1]      [,2]      [,3]     
[1,] "tom.txt" "tom.txt" "tim.txt"
[2,] "tim.txt" "Amy.txt" "Amy.txt"

然后您可以:apply( combs, 2, get.result)

答案 3 :(得分:0)

鉴于您的文件名在矢量中,请说

vec <- c("tom.txt", "tim.txt" , "Amy.txt")

你可以使用

temp <- outer(seq(vec), seq(vec), Vectorize(function(x,y) if(x>y) get.result(vec[x],vec[y]) else 0 ))
result <- temp + t(temp)

请注意,这可确保get.result()仅针对每个相关比较调用一次,即,不会调用相同文件,也不会调用仅按顺序不同的对。

最后一行创建一个对称矩阵。

编辑:要获取名称,请使用:

rownames(result) <- colnames(result) <- vec