将数据帧转换为关联矩阵

时间:2015-05-16 15:04:56

标签: r matrix dataframe

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

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中每个站点的列总和。对于不在对角线上的值,它们显示在一个站点发生了多少次访问,同时还访问了另一个站点。因此,从最终矩阵开始,第2行和第1列显示了对site1的访问次数。

但令我失望的是,在花了一天没有进步之后,我发现很难实现这一目标。我知道如果我创建一个网站矩阵,我可以通过求和添加对角线条目,但我认为这是解决这个问题的一种非常糟糕的方法。我想我可以用一些基本的数学来做这个,但是会很感激一些帮助/指针。

修改

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

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

我的想法最初是在访问方面找出3个网站之间的任何模式。如果客户访问了站点1和站点2,而不是站点3,我希望以矩阵的形式捕获它。

1 个答案:

答案 0 :(得分:2)

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