如何基于规则列表转换矩阵中的值,而不使用R中的for循环

如何基于规则列表转换矩阵中的值,而不使用R中的for循环,r,matrix,replace,rule,R,Matrix,Replace,Rule,我有一个1或0的矩阵 xmat = matrix(round(runif(12),0), ncol=3) [,1] [,2] [,3] [1,] 0 1 1 [2,] 1 0 1 [3,] 1 0 0 [4,] 1 0 1 我还有一个规则表,它是一个列表 a = c(0.2, 0.5) b = c(0.5, 0.6) c = c(0.8, 0.1) names(a) = c("0", "1") names(b)

我有一个1或0的矩阵

xmat = matrix(round(runif(12),0), ncol=3)
     [,1] [,2] [,3]
[1,]    0    1    1
[2,]    1    0    1
[3,]    1    0    0
[4,]    1    0    1
我还有一个规则表,它是一个列表

a = c(0.2, 0.5)
b = c(0.5, 0.6)
c = c(0.8, 0.1)
names(a) = c("0", "1")
names(b) = c("0", "1")
names(c) = c("0", "1")

ruletable = list(a, b, c)

[[1]]
  0   1 
0.2 0.5 

[[2]]
  0   1 
 0.5 0.6 

[[3]]
  0   1 
 0.8 0.1 
我需要用规则表指定的相应值替换xmat每列中的1和0。例如,xmat的第一列是(0,1,1,1),需要使用ruletable[[1]]将其转换为(0.2,0.5,0.5,0.5)。类似地,需要使用ruletable[[2]]将xmat的第二列(1,0,0,0)转换为(0.6,0.5,0.5,0.5)。由于这可能是一个巨大的矩阵,我正在寻找一个不使用for循环的解决方案


谢谢

这应该是合理有效的:

vapply(
  1:length(ruletable), 
  function(x) ruletable[[x]][xmat[, x] + 1L],
  numeric(nrow(xmat))
)
原始矩阵(
set.seed(1)
):

结果:

#      [,1] [,2] [,3]
# [1,]  0.2  0.5  0.8
# [2,]  0.2  0.6  0.8
# [3,]  0.2  0.6  0.8
# [4,]  0.5  0.6  0.1

这应该是合理有效的:

vapply(
  1:length(ruletable), 
  function(x) ruletable[[x]][xmat[, x] + 1L],
  numeric(nrow(xmat))
)
原始矩阵(
set.seed(1)
):

结果:

#      [,1] [,2] [,3]
# [1,]  0.2  0.5  0.8
# [2,]  0.2  0.6  0.8
# [3,]  0.2  0.6  0.8
# [4,]  0.5  0.6  0.1

这应该是合理有效的:

vapply(
  1:length(ruletable), 
  function(x) ruletable[[x]][xmat[, x] + 1L],
  numeric(nrow(xmat))
)
原始矩阵(
set.seed(1)
):

结果:

#      [,1] [,2] [,3]
# [1,]  0.2  0.5  0.8
# [2,]  0.2  0.6  0.8
# [3,]  0.2  0.6  0.8
# [4,]  0.5  0.6  0.1

这应该是合理有效的:

vapply(
  1:length(ruletable), 
  function(x) ruletable[[x]][xmat[, x] + 1L],
  numeric(nrow(xmat))
)
原始矩阵(
set.seed(1)
):

结果:

#      [,1] [,2] [,3]
# [1,]  0.2  0.5  0.8
# [2,]  0.2  0.6  0.8
# [3,]  0.2  0.6  0.8
# [4,]  0.5  0.6  0.1

mapply
回答:

xmat <- matrix(c(0,1,1,1,1,0,0,0,1,1,0,1),nrow=4)
mapply(function(x,y) y[as.character(x)], data.frame(xmat),ruletable)

   X1  X2  X3
0 0.2 0.6 0.1
1 0.5 0.5 0.1
1 0.5 0.5 0.8
1 0.5 0.5 0.1

mapply
回答:

xmat <- matrix(c(0,1,1,1,1,0,0,0,1,1,0,1),nrow=4)
mapply(function(x,y) y[as.character(x)], data.frame(xmat),ruletable)

   X1  X2  X3
0 0.2 0.6 0.1
1 0.5 0.5 0.1
1 0.5 0.5 0.8
1 0.5 0.5 0.1

mapply
回答:

xmat <- matrix(c(0,1,1,1,1,0,0,0,1,1,0,1),nrow=4)
mapply(function(x,y) y[as.character(x)], data.frame(xmat),ruletable)

   X1  X2  X3
0 0.2 0.6 0.1
1 0.5 0.5 0.1
1 0.5 0.5 0.8
1 0.5 0.5 0.1

mapply
回答:

xmat <- matrix(c(0,1,1,1,1,0,0,0,1,1,0,1),nrow=4)
mapply(function(x,y) y[as.character(x)], data.frame(xmat),ruletable)

   X1  X2  X3
0 0.2 0.6 0.1
1 0.5 0.5 0.1
1 0.5 0.5 0.8
1 0.5 0.5 0.1


时间复杂性仍然是m*n,为什么不使用循环?时间复杂性仍然是m*n,为什么不使用循环?时间复杂性仍然是m*n,为什么不使用循环?时间复杂性仍然是m*n,为什么不使用循环?1:length(ruletable)的东西不算作for循环,对吗?@user3193265,为什么不试试这个,看看它是怎么回事?无论如何,在最低级别(即FORTRAN、机器代码等)都会有一个循环来完成此操作
vapply
非常有效。@user3193265,从技术上讲不是,它不是
for
循环。但最终这将在C或FORTRAN中实现为循环<代码>for循环本身并不慢。因为它们经常与不断增长的病媒联系在一起,这是个坏消息。非常感谢!我可以问一下+1L有什么作用吗?@user3193265-
xmat
中的值是0和1,加上+1(或+1L)会使它们变成1和2,从
规则表
列表中的每个向量中选择适当的值。我将插入我自己的答案,指出它依赖于列表的名称,而不是位置查找。1:length(ruletable)这件事不算作for循环,对吗?@user3193265,你为什么不试试这个,看看它是怎么回事?无论如何,在最低级别(即FORTRAN、机器代码等)都会有一个循环来完成此操作
vapply
非常有效。@user3193265,从技术上讲不是,它不是
for
循环。但最终这将在C或FORTRAN中实现为循环<代码>for循环本身并不慢。因为它们经常与不断增长的病媒联系在一起,这是个坏消息。非常感谢!我可以问一下+1L有什么作用吗?@user3193265-
xmat
中的值是0和1,加上+1(或+1L)会使它们变成1和2,从
规则表
列表中的每个向量中选择适当的值。我将插入我自己的答案,指出它依赖于列表的名称,而不是位置查找。1:length(ruletable)这件事不算作for循环,对吗?@user3193265,你为什么不试试这个,看看它是怎么回事?无论如何,在最低级别(即FORTRAN、机器代码等)都会有一个循环来完成此操作
vapply
非常有效。@user3193265,从技术上讲不是,它不是
for
循环。但最终这将在C或FORTRAN中实现为循环<代码>for循环本身并不慢。因为它们经常与不断增长的病媒联系在一起,这是个坏消息。非常感谢!我可以问一下+1L有什么作用吗?@user3193265-
xmat
中的值是0和1,加上+1(或+1L)会使它们变成1和2,从
规则表
列表中的每个向量中选择适当的值。我将插入我自己的答案,指出它依赖于列表的名称,而不是位置查找。1:length(ruletable)这件事不算作for循环,对吗?@user3193265,你为什么不试试这个,看看它是怎么回事?无论如何,在最低级别(即FORTRAN、机器代码等)都会有一个循环来完成此操作
vapply
非常有效。@user3193265,从技术上讲不是,它不是
for
循环。但最终这将在C或FORTRAN中实现为循环<代码>for循环本身并不慢。因为它们经常与不断增长的病媒联系在一起,这是个坏消息。非常感谢!我可以问一下+1L有什么作用吗?@user3193265-
xmat
中的值是0和1,加上+1(或+1L)会使它们变成1和2,从
规则表
列表中的每个向量中选择适当的值。我将插入我自己的答案,指出它依赖于列表的名称,而不是位置查找。他们应该允许人们标记多个答案!谢谢这也行得通。他们应该允许人们标记多个答案!谢谢这也行得通。他们应该允许人们标记多个答案!谢谢这也行得通。他们应该允许人们标记多个答案!谢谢