首页 > 解决方案 > 从 data.frame 创建矩阵并计算常见值

问题描述

我试图了解多个网站上的跨域行为。我有这个信息

Website       ClientID     SessionId
-------------------------------------
domain1          xxx         d.0686
domain2          xxx         d.0686
domain3          yyy         f.1871
domain2          yyy         f.1871
domain4          yyy         f.1871
domain1          zzz         n.9210
domain2          zzz         n.9210

人们可以跨多个网站移动,但他们保留 ClientID(存储为 cookie)和 SessionID(当一个人从一个域移动到另一个域时在不同网站之间共享)。

我需要查看两个不同网站共享多少 SessionID。我想最简单的方法是创建一个矩阵来计算共享的唯一 SessionId。这将是基于上表的结果

          Domain1     Domain2     Domain3     Domain4 
    --------------------------------------------------------
domain1     0            2          0           0

domain2     2            0          1           1

domain3     0            1          0           0

domain4     0            1          0           0

通过这种方式,我可以计算在同一个 sessionID 中使用两个不同网站的次数,并创建一个带有circlize()包的 Chord Diagram 以可视化关系。

可以在R上做到吗?

标签: r

解决方案


domains <- unique(information$Website)
output <- matrix(0, length(domains), length(domains))
colnames(output) <- rownames(output) <- domains

for (x in domains) {
  X <- unique(information[information$Website == x, 'SessionId'])
  for (y in domains) {
    Y <- unique(information[information$Website == y, 'SessionId'])
    output[rownames(output) == x, y] <- length(intersect(X, Y))
  }
}

print(output)

#domain1 domain2 domain3 domain4
#domain1       2       2       0       0
#domain2       2       3       1       1
#domain3       0       1       1       1
#domain4       0       1       1       1

数据

information <- structure(list(Website = c("domain1", "domain2", "domain3", "domain2", "domain4", 
                                          "domain1", "domain2"), 
                              ClientID = c("xxx", "xxx", "yyy", "yyy", "yyy", "zzz", "zzz"), 
                              SessionId = c("d.0686", "d.0686", "f.1871", "f.1871", "f.1871", 
                                            "n.9210", "n.9210")), 
                         .Names = c("Website", "ClientID", "SessionId"), 
                         row.names = c(NA, -7L), class = "data.frame")

推荐阅读