计数在数据帧中具有相同值的列元素并以矩阵格式显示

时间:2018-06-11 16:06:58

标签: r cross-product

我在互联网上搜索类似的解决方案,但我找不到具体的解决方案。让我们说a有以下数据框:

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,1,2]元素将代表列[i,j]1的值为i的行数。对于这种特殊情况,我们有(显示上对角线,因为它是对称的):

j

对角线应计算给定列的 a b c d a 3 2 1 1 b 3 2 1 c 3 2 d 3 值的行数。在这种情况下,所有列都具有相同的值1。格式应类似于1函数(Correlation Matrix)。

我尝试使用cor()(以及来自table()包的crosstab)但它按列对显示信息。

可以通过手动计算每对列的descr的出现(即:1)然后放入矩阵来完成,但我想知道是否有内置的简化过程的功能。

1 个答案:

答案 0 :(得分:2)

我们可以在crossprod上使用matrix来计算问题示例值1的出现次数:

m1 <- as.matrix(df == 1) # see Note[1]
out <- crossprod(m1)

注意[1] 由@imo指出(请参阅下面的评论)以解决一般情况(值为[x,y]的矩阵)。对于[0,1]df==1的矩阵,可以用df替换。要计算问题示例中的2值,请使用:df == 2

如果下对角线应为0NA

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