我有一个向量,它包含数据向量的名称,名为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)的函数获得,该函数查找目录中两个文本文件的对应数据向量,并对它们执行一些操作,然后返回矩阵中每个位置的值。例如,如果我想获得条目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)中。
发布于 2013-08-14 18:13:05
试试这个解决方案
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-14 18:16:00
fn = dir(pattern=".txt") (如果需要更改模式)将为您提供目标文件夹中的文本文件。然后,您可以像在前面的答案中一样,循环遍历该列表。
发布于 2013-08-14 19:44:48
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)
https://stackoverflow.com/questions/18238973
复制相似问题