将数据框转换为关联矩阵

Convert dataframe to an association matrix

我有一个数据框,其中包含我们拥有的不同站点的客户访问。例如:

df1 <- read.csv(header = TRUE, text = 
'customer,site1,site2,site3
a.1,1,20,30
a.1,2,30,1
a.2,3,40,10
a.3,2,10,10
a.4,0,1,2')

df1
      customer site1 site2 site3
1      a.1     1    20    30
2      a.1     2    30     1
3      a.2     3    40    10
4      a.3     2    10    10
5      a.4     0     1     2

我想把上面的改成下面的形式:

sites   site1   site2   site3
site1   8        100    51
site2   100      101    53
site3   51        53    53

上面的矩阵在对角线上显示了 df1 中每个站点的列总和。对于不在对角线上的值,它们显示了一个站点的访问次数,前提是另一个站点也被访问过。因此,在最终矩阵中,第二行和第一列显示了在访问站点 1 的情况下站点 2 发生了多少次访问。

但令我失望的是,在花了一天时间没有任何进展之后,我发现很难实现这一目标。我知道如果我创建一个站点矩阵,我可以通过求和来添加对角线条目,但我认为这是解决这个问题的一种很糟糕的方法。我想我可以使用一些初等数学来做到这一点,但希望能有一些 help/pointers.

编辑

抱歉,问题不正确。正确的输出如@josilber所示。

#       site1 site2 site3
# site1     8     8     8
# site2   100   101   101
# site3    51    53    53

我最初的想法是找出这 3 个网站之间的访问模式。如果客户访问站点 1 和站点 2,但不访问站点 3,我曾希望以矩阵的形式捕获它。

df1 的数字列进行运算,您可以限制该列为正的行,取列总和:

cols <- paste0("site", 1:3)
sapply(cols, function(x) colSums(df1[df1[,x] != 0, cols]))
#       site1 site2 site3
# site1     8     8     8
# site2   100   101   101
# site3    51    53    53