如何基于规则列表转换矩阵中的值,而不使用R中的for循环
我有一个1或0的矩阵如何基于规则列表转换矩阵中的值,而不使用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)
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,从规则表
列表中的每个向量中选择适当的值。我将插入我自己的答案,指出它依赖于列表的名称,而不是位置查找。他们应该允许人们标记多个答案!谢谢这也行得通。他们应该允许人们标记多个答案!谢谢这也行得通。他们应该允许人们标记多个答案!谢谢这也行得通。他们应该允许人们标记多个答案!谢谢