我有一个数据框,其中包含我们在不同站点的客户访问。例如:
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的访问次数。
但令我失望的是,在花了一天没有进步之后,我发现很难实现这一目标。我知道如果我创建一个网站矩阵,我可以通过求和添加对角线条目,但我认为这是解决这个问题的一种非常糟糕的方法。我想我可以用一些基本的数学来做这个,但是会很感激一些帮助/指针。
# site1 site2 site3
# site1 8 8 8
# site2 100 101 101
# site3 51 53 53
我的想法最初是在访问方面找出3个网站之间的任何模式。如果客户访问了站点1和站点2,而不是站点3,我希望以矩阵的形式捕获它。
答案 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