Код кадра данных, кажется, останавливается только после решения первой строки? - PullRequest
1 голос
/ 30 апреля 2020

Я запускаю строку кода ниже, чтобы предсказать значения, используя данную формулу. Я использую m в качестве значения для расчета недостающих данных в этой строке c.

m <- 2
UM.Item[m,]
for (j in 1:nUsers){
  if (UM.Item[m, j] == 0) {
    UM.Item[m, j] = (ItemAverage[m] - µ) + (UserAverage[j] - µ) + µ
  }
}
UMGlobal <- UM.Item[m,]
UMGlobal

В идеале я могу рассчитать все пропущенные значения (обозначенные нулями) одновременно, но сейчас мне кажется, что я могу установить только одно значение m за раз.

Другими словами, я хотел бы сделать m = 1:15 (15 - мое общее количество строк), но код почему-то останавливается после вычисления первой строки по какой-то причине.

Любая помощь очень ценится.

1 Ответ

0 голосов
/ 01 мая 2020

Просто для удовольствия, большинство операций зацикливания могут быть выполнены в 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
#
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...