gpt4 book ai didi

r - 具有多个条件的 for 循环的向量化

转载 作者:行者123 更新时间:2023-12-04 01:31:42 27 4
gpt4 key购买 nike

dummies  = matrix(c(0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0), nrow=6, ncol=6)
colnames(dummies) <- c("a","b", "c", "d", "e", "f")

我有一个带假人的矩阵
> dummies
a b c d e f
[1,] 0 0 0 0 1 0
[2,] 0 0 1 0 0 0
[3,] 1 0 0 0 0 0
[4,] 0 0 0 0 0 1
[5,] 0 1 0 0 0 0
[6,] 0 0 0 1 0 0

我知道我的假人是相关的,因为第 1 行与 2、3 与 4 以及 5 与 6 分组。我想在与上述同一行的同一组中的那些人之间拆分每个虚拟代码(1):
> dummies
a b c d e f
[1,] 0.0 0.0 -0.5 0.0 0.5 0.0
[2,] 0.0 0.0 0.5 0.0 -0.5 0.0
[3,] 0.5 0.0 0.0 0.0 0.0 -0.5
[4,] -0.5 0.0 0.0 0.0 0.0 0.5
[5,] 0.0 0.5 0.0 -0.5 0.0 0.0
[6,] 0.0 -0.5 0.0 0.5 0.0 0.0

为此,我执行以下操作:
dummies <- ifelse(dummies==1, 0.5, 0)
for (i in 1:nrow(dummies)){
column = which(dummies[i,] %in% 0.5)
if (i %% 2 != 0) {
dummies[i+1, column] <- -0.5
} else {
dummies[i-1, column] <- -0.5
}
}

我的问题是我是否可以使用矢量化代码来实现这一点。我不知道如何使用 ifelse在这种情况下,因为我无法将它与行索引结合起来找到 0.5在每一行上。

最佳答案

这是基础 R 的一次尝试

# get locations of ones
ones <- which(dummies == 1)
# get adjacent locations
news <- ones + c(1L, -1L)[(ones %% 2 == 0L) + 1L]

# fill out matrix
dummiesDone <- dummies * 0.5
dummiesDone[news] <- -0.5

dummiesDone
a b c d e f
[1,] 0.0 0.0 -0.5 0.0 0.5 0.0
[2,] 0.0 0.0 0.5 0.0 -0.5 0.0
[3,] 0.5 0.0 0.0 0.0 0.0 -0.5
[4,] -0.5 0.0 0.0 0.0 0.0 0.5
[5,] 0.0 0.5 0.0 -0.5 0.0 0.0
[6,] 0.0 -0.5 0.0 0.5 0.0 0.0

该解决方案利用矩阵只是具有维度属性的向量这一事实。 which在底层向量中找到 1s 的位置。

第二行中的第二项, c(1, -1)[(ones %% 2 == 0L) + 1L]允许根据原始位置是偶数还是奇数来选择将用于拆分一个值的向量的“对”元素。这在这里有效,因为有偶数行,这在配对元素的问题中是必要的。

下一行根据元素最初是一 (0.5) 还是相邻的对元素 (-0.5) 来填充矩阵。请注意,第二个命令利用了潜在的矢量位置概念。

第二种方法借鉴了 hubertl、thelatemail 和 martin-morgan 的帖子和评论的概念,首先从正确位置的原始矩阵中减去 0.5 以获得与上述相同的索引
# get locations of ones
ones <- which(dummies == 1)
# get adjacent locations
news <- ones + c(1L, -1L)[(ones %% 2 == 0L) + 1L]

然后合并 [<-减法
dummies[c(ones, news)] <- dummies[c(ones, news)] - .5
dummies
a b c d e f
[1,] 0.0 0.0 -0.5 0.0 0.5 0.0
[2,] 0.0 0.0 0.5 0.0 -0.5 0.0
[3,] 0.5 0.0 0.0 0.0 0.0 -0.5
[4,] -0.5 0.0 0.0 0.0 0.0 0.5
[5,] 0.0 0.5 0.0 -0.5 0.0 0.0
[6,] 0.0 -0.5 0.0 0.5 0.0 0.0

关于r - 具有多个条件的 for 循环的向量化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41603448/

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