這裏是使用combn
,sapply
和rowSums
的基本R方法。
# get the pairwise combination of variables
varComb <- combn(names(df), 2)
varComb
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] "V1" "V1" "V1" "V2" "V2" "V3"
[2,] "V2" "V3" "V4" "V3" "V4" "V4"
# get the counts
counts <- sapply(seq_len(ncol(varComb)),
function(i) sum(rowSums(df[,varComb[,i]] > 0) == 2))
這裏,變量組合用於子集的數據幀,這是基於該值是否是大於0的行被SUMED在一起並進行計數轉換爲一個邏輯矩陣(使用sum
)根據結果是否等於2. sapply
允許我們將此計數應用於varComb中存在的每對變量。
# put these into a data frame
setNames(data.frame(t(varComb), counts), c("var1", "var2", "counts"))
var1 var2 counts
1 V1 V2 2
2 V1 V3 1
3 V1 V4 2
4 V2 V3 0
5 V2 V4 2
6 V3 V4 1
把這些結果在一起,我們可以使用setNames
,這使我們能夠創建一個數據幀,並在同一行申請名稱的變量。
把這一結果爲矩陣,你可以使用cbind
和矩陣子集:
# construct empty matrix
tempMat <- matrix(NA, 4, 4)
# fill it in
tempMat[cbind(as.integer(substr(dfNew$var2, 2, 2)),
as.integer(substr(dfNew$var1, 2, 2)))] <- dfNew$counts
tempMat
[,1] [,2] [,3] [,4]
[1,] NA NA NA NA
[2,] 2 NA NA NA
[3,] 1 0 NA NA
[4,] 2 2 1 NA
的as.integer
和substr
提取行並在其中放置值的列,cbind
將這個輸出成一個用於矩陣子化的矩陣。
這是一個整潔的想法,但有沒有辦法將輸出作爲矩陣? – Zwentibold