【问题标题】:Create a function that takes in a vector and returns a matrix in R创建一个函数,该函数接受一个向量并在 R 中返回一个矩阵
【发布时间】:2014-11-20 23:45:33
【问题描述】:

我正在尝试创建一个函数,该函数将接收向量 k 并返回给我一个长度为 length(distMat[1,]) 的矩阵,长度为 (k)。 distMat 是一个巨大的矩阵,而 indSpam 是一个长向量。特别是对于我的情况,长度(distMat [1,])是2412。当我输入k作为长度为1的向量时,我得到一个长度为2412的向量。我希望能够输入k作为向量长度为 2,得到一个 2412x2 的矩阵。我正在尝试使用while循环让它通过k的长度,但它只返回给我一个长度为2412的向量。我做错了什么?

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
  }
}

【问题讨论】:

  • 我觉得可以用cbind把一些向量绑定在一起,但是如何创建一个向量,保存,然后放到cbind中呢?
  • 矩阵的条目是什么?你的问题都是关于尺寸的。您是否关心您返回的矩阵是否是正确的形状但填充了 0? indSpam 的相关性是什么? while 循环肯定是没有必要的。

标签: r matrix vector


【解决方案1】:

我正在尝试创建一个函数,该函数将接受向量 k 并返回给我一个矩阵,其维度为 length(distMat[1,]) by length(k)

这是一个执行此操作的函数。

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

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

根据您的评论,我想我更了解您的目标。您有一个返回长度为 k 的向量的函数,并且您希望将其输出保存为矩阵中的行。这是一个很常见的任务。让我们做一个简单的例子,k1: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()进行预分配,不需要编写任何特殊函数。

【讨论】:

  • 对不起,如果我不清楚!我将 k 输入到一个函数中,我将对它做一些事情,它会以不同的方式出现。我需要保存那个输出向量,让函数遍历向量的每个元素,然后保存每个输出向量并将其构造成一个矩阵。您的回答有助于让我找到正确的矩阵格式!我尝试将旧返回值放入矩阵的数据部分,但现在,它只给了我第一个输出向量的副本。
  • 已编辑以解决您现在更清楚地陈述的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-20
  • 2016-12-20
  • 1970-01-01
  • 1970-01-01
  • 2018-09-11
相关资源
最近更新 更多