2014-11-20 31 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

相关问题