R 数据帧代码似乎在仅解决第一行后停止?

R 数据帧代码似乎在仅解决第一行后停止?,r,dataframe,R,Dataframe,我正在运行下面的代码行,以使用给定的公式预测值。我使用m作为值来计算该特定行中缺少的数据 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作为值来计算该特定行中缺少的数据

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只是为了好玩,与其他编程语言相比,大多数循环操作都可以在R中以不同的方式完成。如果我需要在pxq矩阵a的位置I,j处替换零,我可以生成一个pxq矩阵B,除了所需的I,j元素之外的所有0,然后我可以添加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)矩阵,除了我需要在原始数据矩阵中替换的(I,j)位置,其中我需要1。请注意,*是简单的数字乘法运算符

现在,如果我测试逻辑表达式A==0,我将得到一个pxq矩阵,其中元素为假,在感兴趣的[I,j]位置为真。我需要将这样一个逻辑矩阵分别转换为0和1,以便得到D。我不能使用数据类型转换函数,例如
as.integer
,因为矩阵被强制为向量。但是我可以添加0来获得D
这是代码,它可以被放入一个函数中,以data和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
#
#人工数据

A只是为了好玩,与其他编程语言相比,大多数循环操作都可以在R中以不同的方式完成。如果我需要在pxq矩阵a的位置I,j处替换零,我可以生成一个pxq矩阵B,除了所需的I,j元素之外的所有0,然后我可以添加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)矩阵,除了我需要在原始数据矩阵中替换的(I,j)位置,其中我需要1。请注意,*是简单的数字乘法运算符

现在,如果我测试逻辑表达式A==0,我将得到一个pxq矩阵,其中元素为假,在感兴趣的[I,j]位置为真。我需要将这样一个逻辑矩阵分别转换为0和1,以便得到D。我不能使用数据类型转换函数,例如
as.integer
,因为矩阵被强制为向量。但是我可以添加0来获得D
这是代码,它可以被放入一个函数中,以data和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
#
#人工数据

A你所说的“代码在计算第一行后似乎停止了”是什么意思?你是说第一行代码吗?还是第一行数据?(或者第二行,因为您似乎正在修复
m=2
,并且现在只在第二行操作?)是的,对不起。代码本身工作正常,但在计算完第一行数据后,循环似乎停止了。在这种情况下,在计算第二行数据之后,其余的数据保持不变。您需要一个外循环来递增
m
,递增方式与递增
j
的方式相同,因此
for(m In 1:nrow(UM.Item)){for(j In 1:nUsers){…}
您所说的“代码在计算第一行之后似乎停止了”是什么意思?你是说第一行代码吗?还是第一行数据?(或者第二行,因为您似乎正在修复
m=2
,并且现在只在第二行操作?)是的,对不起。代码本身工作正常,但在计算完第一行数据后,循环似乎停止了。在这种情况下,在计算第二行数据之后,其余的数据保持不变。您需要一个外循环来递增
m
,递增方式与递增
j
相同,因此
for(m In 1:nrow(UM.Item)){for(j In 1:nUsers){…}