gpt4 book ai didi

r - 如何在没有嵌套 for 循环的情况下快速填充矩阵

转载 作者:行者123 更新时间:2023-12-02 01:45:09 25 4
gpt4 key购买 nike

我有一个值为 0、1 和 2 的数据集。

data <- matrix(c(1, 0, 0, 1, 2, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 2, 0, 1, 1, 1), nrow = 5, ncol = 4)
> data
[,1] [,2] [,3] [,4]
[1,] 1 1 0 2
[2,] 0 1 0 0
[3,] 0 0 0 1
[4,] 1 1 0 1
[5,] 2 0 0 1

我想根据这些数据创建一个矩阵,使值 0 为 (0, 0),1 为 (1, 0),2 为 (0, 1)。下面是我正在使用的代码:

data.exp <- matrix(NA, nrow = nrow(data)*2, ncol = ncol(data))
for(i in 1:nrow(data)){
for(j in 1:(ncol(data))){
if(data[i,j] == 1){
vec <- c(1, 0)
}else if(data[i, j] == 0){
vec <- c(0, 0)
}else{
vec <- c(0, 1)
}
data.exp[((i*2-1):(i*2)), j] <- vec
}
}
> data.exp
[,1] [,2] [,3] [,4]
[1,] 1 1 0 0
[2,] 0 0 0 1
[3,] 0 1 0 0
[4,] 0 0 0 0
[5,] 0 0 0 1
[6,] 0 0 0 0
[7,] 1 1 0 1
[8,] 0 0 0 0
[9,] 0 0 0 1
[10,] 1 0 0 0

有没有更快的方法来生成矩阵 data.exp,而不必在 R 中使用嵌套的 for 循环?随着样本量的增加,嵌套 for 循环方法的效率不是很高。

最佳答案

apply对于矩阵来说应该很快。创建一个列表,v , 通过考虑 0 具有适当的值和子集, 1 , 或 2data作为 v 的索引

v = list(c(0, 0), c(1, 0), c(0, 1))
apply(data, 2, function(i) do.call(cbind, v[i + 1]))
# [,1] [,2] [,3] [,4]
# [1,] 1 1 0 0
# [2,] 0 0 0 1
# [3,] 0 1 0 0
# [4,] 0 0 0 0
# [5,] 0 0 0 1
# [6,] 0 0 0 0
# [7,] 1 1 0 1
# [8,] 0 0 0 0
# [9,] 0 0 0 1
# [10,] 1 0 0 0

关于r - 如何在没有嵌套 for 循环的情况下快速填充矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70993562/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com