我有一个向量,其中包含名为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)
。
答案 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