这是基地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
创建一个指示行组的向量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,]
这是另一种方法:
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