这里是使用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