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进行了分组。
> 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]允许根据原始位置是偶数还是奇数来选择向量的“对”元素,该元素将用于拆分“1”值。这行得通,因为行数是偶数,这在成对元素的问题中是必需的。

接下来的行根据元素最初是一个(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/

10-12 18:58