计数对数据框中具有相同值的列元素进行配对,并以矩阵格式显示
Counting pairs column elements with the same value in a data frame and shows in a matrix format
我在互联网上搜索类似的解决方案,但找不到适合我的案例的具体解决方案。假设有以下数据框:
a = c(1, 1, 1, 2, 2)
b = c(2, 1, 1, 1, 2)
c = c(2, 2, 1, 1, 1)
d = c(1, 2, 2, 1, 1)
df <- data.frame(a = a, b = b, c = c, d = d)
和 df
看起来像这样:
a b c d
1 1 2 2 1
2 1 1 2 2
3 1 1 1 2
4 2 1 1 1
5 2 2 1 1
注意:在这个例子中我使用了[1,2]
对值,但它可以是一组不同的值:[-1,1]
甚至更多两个可能的值:[-1,1,2]
.
现在我想要一个矩阵,其中每个 [i,j]
元素代表列 i
和 j
的值为 1
的行数。对于这种特殊情况,我们有(显示上对角线,因为它是对称的):
a b c d
a 3 2 1 1
b 3 2 1
c 3 2
d 3
对角线应计算给定列中具有 1
值的行数。在这种情况下,所有列都具有相同数量的值 1
。格式应类似于 cor()
函数(相关矩阵)。
我试图使用 table()
(以及 descr
包中的 crosstab
),但它按对列显示信息。
可以通过手动计算每对列(即:nrow(df[df$a==1 & df$b==1,])=2
)出现1
然后放入矩阵来完成,但我想知道是否有内置的- 简化流程的功能。
我们可以在 matrix
上使用 crossprod
来计算问题示例中值 1
的出现次数:
m1 <- as.matrix(df == 1) # see Note[1]
out <- crossprod(m1)
注意[1] 由@imo(见下面的评论)指出,用于解决一般情况(具有值的矩阵:[x,y]
)。对于具有 [0,1]
个值的矩阵,df==1
可以替换为 df
。要计算问题示例中的 2
值,请使用:df == 2
.
如果下对角线应该是0
或者NA
out[lower.tri(out)] <- NA
out
# a b c d
#a 3 2 1 1
#b NA 3 2 1
#c NA NA 3 2
#d NA NA NA 3
我在互联网上搜索类似的解决方案,但找不到适合我的案例的具体解决方案。假设有以下数据框:
a = c(1, 1, 1, 2, 2)
b = c(2, 1, 1, 1, 2)
c = c(2, 2, 1, 1, 1)
d = c(1, 2, 2, 1, 1)
df <- data.frame(a = a, b = b, c = c, d = d)
和 df
看起来像这样:
a b c d
1 1 2 2 1
2 1 1 2 2
3 1 1 1 2
4 2 1 1 1
5 2 2 1 1
注意:在这个例子中我使用了[1,2]
对值,但它可以是一组不同的值:[-1,1]
甚至更多两个可能的值:[-1,1,2]
.
现在我想要一个矩阵,其中每个 [i,j]
元素代表列 i
和 j
的值为 1
的行数。对于这种特殊情况,我们有(显示上对角线,因为它是对称的):
a b c d
a 3 2 1 1
b 3 2 1
c 3 2
d 3
对角线应计算给定列中具有 1
值的行数。在这种情况下,所有列都具有相同数量的值 1
。格式应类似于 cor()
函数(相关矩阵)。
我试图使用 table()
(以及 descr
包中的 crosstab
),但它按对列显示信息。
可以通过手动计算每对列(即:nrow(df[df$a==1 & df$b==1,])=2
)出现1
然后放入矩阵来完成,但我想知道是否有内置的- 简化流程的功能。
我们可以在 matrix
上使用 crossprod
来计算问题示例中值 1
的出现次数:
m1 <- as.matrix(df == 1) # see Note[1]
out <- crossprod(m1)
注意[1] 由@imo(见下面的评论)指出,用于解决一般情况(具有值的矩阵:[x,y]
)。对于具有 [0,1]
个值的矩阵,df==1
可以替换为 df
。要计算问题示例中的 2
值,请使用:df == 2
.
如果下对角线应该是0
或者NA
out[lower.tri(out)] <- NA
out
# a b c d
#a 3 2 1 1
#b NA 3 2 1
#c NA NA 3 2
#d NA NA NA 3