0

我有一个向量,其中包含数据向量的名称,名为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 个文本文件的相应数据向量并对它们进行一些操作,然后为矩阵中的每个位置返回一个值。例如,如果我想获取 entry 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

4 回答 4

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
于 2013-08-14T18:13:05.400 回答
1

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

于 2013-08-14T18:16:00.957 回答
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
于 2013-08-14T20:05:39.620 回答
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)

于 2013-08-14T19:44:48.400 回答