当前位置:  开发笔记 > 编程语言 > 正文

具有多个条件的for循环的矢量化

如何解决《具有多个条件的for循环的矢量化》经验,为你挑选了3个好方法。



1> lmo..:

这是基地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在底层矢量中找到1的位置.

第二行中的第二项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



2> Martin Morga..:

创建一个指示行组的向量grp,并从组的rowsum(dummies, grp) / 2每个成员中减去组均值,如

grp = rep(seq_len(nrow(dummies) / 2), each=2)
dummies - rowsum(dummies, grp)[grp,] / 2

更一般地说,允许不同大小和无序的组

dummies - (rowsum(dummies, grp) / tabulate(grp))[grp,]



3> Pierre Lafor..:

这是另一种方法:

dummies[] <- sapply(split(dummies, gl(length(dummies)/2,2)), function(v) if(any(!!v))v-.5 else v)
        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

推荐阅读
围脖上的博博_771
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有