2014-11-20 4 views
0

Я пытаюсь создать функцию, которая будет принимать вектор k и вернуть мне матрицу с размерами length (distMat [1,]) по длине (к). distMat - огромная матрица, а indSpam - длинный вектор. В частности, в моей ситуации длина (distMat [1,]) равна 2412. Когда я вхожу в k как вектор длины один, я получаю вектор длиной 2412. Я хочу иметь возможность вводить k в качестве вектора длины два и получить матрицу 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

+0

Каковы записи матрицы? Ваш вопрос касается размеров. Вам небезразлична ли матрица, которую вы получаете, правильная форма, но заполненная 0? Какова актуальность 'indSpam'? Цикл 'while', безусловно, не нужен. – Gregor

ответ

0

Я пытаюсь создать функцию, которая будет принимать в векторе к и вернуться ко мне матрица с длиной размеров (distMat [1,]) по длине (к)

Вот функция, которая делает это.

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

+0

Отредактировано для решения вашей более-менее четко заданной проблемы – Gregor

Смежные вопросы