将数据框转换为关联矩阵
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
我有一个数据框,其中包含我们拥有的不同站点的客户访问。例如:
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