2014-11-20 70 views
0

我正在嘗試創建一個函數,它將採用向量k並返回一個長度爲(distMat [1,])的矩陣K)。 distMat是一個巨大的矩陣,indSpam是一個長向量。特別是對於我的情況,length(distMat [1,])是2412.當我輸入k作爲長度爲1的矢量時,我得到一個長度爲2412的矢量。我希望能夠輸入k作爲矢量長度爲2,得到2412x2的矩陣。我試圖使用while循環讓它穿過k的長度,但它只返回給我一個長度爲2412的矢量。我在做什麼錯了?創建一個函數,它接受一個向量並返回一個矩陣R

predNeighbor = function(k, distMat, indSpam){ 
    counter = 1 
    while (counter<(length(k)+1)) 
    { 
preMatrix = apply(distMat, 1, order) 
orderedMatrix = t(preMatrix) 
truncate = orderedMatrix[,1:k[counter]] 
checking = indSpam[truncate] 
checking2 = matrix(checking, ncol = k[counter]) 
number = apply(checking2, 1, sum) 


return(number[1:length(distMat[1,])] > (k[counter]/2)) 
counter = counter + 1 
    } 
} 
+0

我想我可以使用cbind將一些向量綁定在一起,但是我怎樣才能創建一個向量,保存它,然後把它放入cbind中? – swordyfish 2014-11-21 00:06:56

+0

矩陣的條目是什麼?你的問題是關於維度的。你是否在意你回來的矩陣是正確的形狀,但充滿了0? 「indSpam」的相關性是什麼? while循環肯定沒有必要。 – Gregor 2014-11-21 00:52:42

回答

0

我試圖創建將在一個矢量k和由長度尺寸爲長度(distMat [1,2])返回到我的矩陣(K)

的函數這是一個這樣做的功能。

foo <- function(k, distMat) { 
    return(matrix(0, nrow = length(distMat[1, ]), ncol = length(k))) 
} 

如果您有其他要求,請用文字描述。

根據您的評論,我認爲我更瞭解您的目標。你有一個函數返回一個長度爲k的向量,並且你想將它的輸出保存爲矩陣中的行。這是一個相當普遍的任務。我們來做一個簡單的例子,其中k起始爲1:10,並且說我們想用函數foo()添加一些噪音,看看排名如何變化。

在功能的輸入始終相同的情況下,replicate()工作得很好。它會自動把一切都放在一個矩陣

k <- 1:10 
noise_and_rank <- function(k) { 
    rank(k + runif(length(k), min = -2, max = 2)) 
} 

results <- replicate(n = 8, expr = {noise_and_rank(k)}) 

在要迭代的情況下,即從一氣呵成輸出是下一個輸入,一個for循環是好的,我們只是預分配矩陣0的,在同一時間

k <- 1:10 
n.sim <- 8 
results <- matrix(0, nrow = length(k), ncol = n.sim) 
results[, 1] <- k 
for(i in 2:n.sim) { 
    results[, i] <- noise_and_rank(results[, i - 1]) 
} 

什麼你原來的問題似乎是的是如何做預分配在一列/行來填補。如果輸入始終相同,則使用replicate()表示您不用擔心。如果每次輸入都不相同,則使用matrix()進行預分配,則不需要編寫任何特殊功能。

+0

對不起,如果我不清楚!我將k輸入到一個函數中,我會對它做些什麼,它會以不同的方式出現。我需要保存輸出矢量,讓函數遍歷矢量的每個元素,並保存每個輸出矢量並將其構造成矩陣。 你的答案有助於我獲得正確的矩陣格式! 我試圖把我的舊返回到矩陣的數據部分,但現在,它只給我我的第一個輸出向量的副本。 – swordyfish 2014-11-21 19:15:04

+0

編輯是爲了解決您現在更明確的問題 – Gregor 2014-11-22 08:25:30

相關問題