Просто для удовольствия, большинство операций зацикливания могут быть выполнены в R другим способом по сравнению с другими языками программирования. Если мне нужно заменить нули в позиции i, j матрицы apxq A , я могу сгенерировать матрицу apxq B со всеми 0, за исключением желаемого i , j элементов, тогда я могу добавить A + B .
Я понимаю, что для некоторого постоянного значения µ выражение:
(ItemAverage[m] - µ) + (UserAverage[j] - µ) + µ
или ItemAverage[m] + UserAverage[j] - µ
означает «среднее по строке [ m ] плюс среднее по столбцу [» j ] вычитая µ ".
Я могу получить средства по столбцам и строкам и использовать их для построения матрицы (pxq) C, в которой каждый элемент i, j является суммой i-тый ряд и j-тый столбец означает. В R делают C - µ вычитает µ на каждый элемент C. И я могу умножить C * D = B , где D - матрица (pxq) со всеми 0, кроме ( i, j ) позиции, которые мне нужно заменить в исходной матрице данных, где мне нужны единицы. Заметьте, что * - это простой числовой оператор умножения c.
Теперь, если я проверю логическое выражение A == 0, я получу матрицу apxq с элементами FALSE и TRUE в [ i, j ] позициях, представляющих интерес , Мне нужно преобразовать такую логическую матрицу в 0 и 1 соответственно, чтобы получить D . Я не могу использовать функции преобразования типов данных, такие как as.integer
, потому что матрица приведена к вектору. Но я могу добавить 0, чтобы получить D :
Вот код, его можно поместить в функцию с данными и mu в качестве параметров
# artificial data
A <-matrix(sample(0:10, 15*4, replace=T), 15, 4)
A
# constant mu of the formula
mu <- 0 # can be any value
# obtaining means by columns and rows
rmeans <- rowMeans(A)
cmeans <- colMeans(A)
# means by rows to build a matrix of ncol(A) columns
# a kind of "cbind"
rowsM <- matrix(rmeans, nrow(A), ncol(A))
rowsM
# means by columns to build a matrix of nrow(A) rows
# A kind of "rbind"
colsM <- matrix(cmeans, ncol(A), nrow(A))
colsM
# it should be transposed to sum both
C <- rowsM + t(colsM)
C
# getting a matrix with all 0 and 1 where elements need to be replaced
D <- ( A == 0 ) + 0
D
new_A <- A + (C - mu) * D
new_A
#