如何只:
out <- matrix(0L, nrow = nrow(x), ncol = max(x))
for (i in 1:nrow(x)) out[i, x[i, ]] <- 1L
> out
[,1] [,2] [,3] [,4]
[1,] 1 1 0 0
[2,] 1 0 1 0
[3,] 1 0 0 1
[4,] 0 1 1 0
[5,] 0 1 0 1
[6,] 0 0 1 1
我們也可以做到這一點沒有循環,雖然它可能是一個小的可讀性(感謝@Frank爲步法):
m <- matrix(0L, choose(4, 2), 4)
m[cbind(rep(1:choose(4, 2), each = 2), c(combn(4, 2)))] <- 1L
容易裹入的函數:
participants <- function(m, n){
if (n > m) stop()
mcn <- choose(m, n)
out <- matrix(0L, mcn, m)
out[cbind(rep(1:mcn, each = n), c(combn(m, n)))] <- 1L
out
}
> participants(6, 5)
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 1 1 1 1 1 0
[2,] 1 1 1 1 0 1
[3,] 1 1 1 0 1 1
[4,] 1 1 0 1 1 1
[5,] 1 0 1 1 1 1
[6,] 0 1 1 1 1 1
這可以使用在''combn' +的'FUN'選項來完成(t(下combn(4,2,FUN =函數(x)的1:%×4%)))' – akrun
@ akrun的評論實際上效果最好(即最容易理解)。 (你可以把它作爲答案?)heroka的答案可能有一個小錯字,因爲我得到錯誤。 MichaelChirico的答案是最快的。 – Heisenberg
我以@ akrun's和他爲基準進行了基準測試,光速更快(對於20選擇10,速度更快3000倍)。 – MichaelChirico