【发布时间】:2017-03-10 21:27:32
【问题描述】:
如果这是一个问得不好的问题,我深表歉意。这是我在 StackOverflow 上的第一个问题。
我有一些应用程序的使用数据,我试图将其转换为热图,以显示跨应用程序的用户之间的重叠使用情况。我很难将数据转换为适合在 corrplot(我首选的热图可视化包)中可视化热图的格式。
数据经过格式化,因此每个可能的应用使用组合都表示为一行(例如,单独的 app1、单独的 app2、单独的 app1+app2、单独的 app3、app1+app3、app2+app3、app1+app2+app3 等)属于该特定应用使用配置的用户的相应数量(例如,仅使用过 app1 和 app3 的用户将向该特定行贡献 1)。
应用启动数据示例:
df.start <- data.frame(appset = c("[app1]","[app2]","[app3]","[app1;app2]","[app2;app3]","[app1;app3]","[app1;app2;app3"]),
unique_users = c(1000, 400, 150, 300, 30, 130,10))
我想最终将数据放入具有以下属性的表单中:
1)每一行和每一列都代表一个应用程序(如相关矩阵),因此对于 3 个应用程序集,它应该是一个 3x3 矩阵,其中行是“app1”“app2”“app3”,列也是“app1” 'app2' 'app3'
(如果更容易按列规范化,这也可以)
我的目标是让它看起来像这样:
df.end <- data.frame(app1 = c(1, 310/1440, 140/1440),
app2 = c(310/740, 1, 40/740),
app3 = c(140/320, 40/320, 1))
row.names(df.end) <- c('app1','app2','app3')
(我一直将数字作为“300/1430”之类的比率包含在内,以演示我希望在每一行上进行的计算类型以标准化数据,但最终该值应该在该实例中显示为 .20979;它是如何将通过运行该代码出现在 R 中,这是我希望它出现的方式)
我不喜欢以这种形式获取数据,我最终只需要一种方法来可视化跨应用程序的交叉使用关系,而热图过去曾为我提供了很好的这些目的。我需要的是:
1)使用它们的名称自动检测数据中的应用程序以生成矩阵的行和列(因为我有不止 3 个示例应用程序,并且希望针对不同目的在感兴趣的应用程序的各种组合上重新运行代码)
2) 数字表示为应用之间的比率,以便两个方向都表示在数据中的某个位置(例如,同时使用 app2 的 app1 用户的比率以及也使用 app1 的 app2 用户的比率)。
我已经手动完成了单个单元格的计算(将结果复制并粘贴到 excel 中以匹配我需要的表格),但这对于可重现的结果和应用到新数据集来说显然是一种糟糕的方法。
将应用程序集分成我开始的列:
df.start <- mutate(df.start,
app1 = ifelse(grepl("app1", df.start$appset),TRUE,FALSE),
app2 = ifelse(grepl("app2", df.start$appset),TRUE,FALSE),
app3 = ifelse(grepl("app3", df.start$appset),TRUE,FALSE))
查找每个用户的唯一用户总数(用于稍后对行进行规范化):
total_app1 <- sum(df.start$unique_users[df.start$app1])
total_app2 <- sum(df.start$unique_users[df.start$app2])
total_app3 <- sum(df.start$unique_users[df.start$app3])
然后手工生成标准化数据的各个单元格复制粘贴到excel中:
sum(df.start$unique_users[df.start$app1 & df.start$app1])/total_app1
sum(df.start$unique_users[df.start$app1 & df.start$app2])/total_app1
sum(df.start$unique_users[df.start$app1 & df.start$app3])/total_app1
sum(df.start$unique_users[df.start$app2 & df.start$app1])/total_app2
sum(df.start$unique_users[df.start$app2 & df.start$app2])/total_app2
sum(df.start$unique_users[df.start$app2 & df.start$app3])/total_app2
sum(df.start$unique_users[df.start$app3 & df.start$app1])/total_app3
sum(df.start$unique_users[df.start$app3 & df.start$app2])/total_app3
sum(df.start$unique_users[df.start$app3 & df.start$app3])/total_app3
如果我想对包含其他应用程序的数据集进行自动化处理,显然不应该这样做,但如果它有助于解释我的尝试,我想包括到目前为止我一直在做的事情。
提前致谢!
编辑:在示例数据中遗漏了一个重要细节,即应用集可以超过两个(例如,对于同时使用所有三个应用的用户存在一行)。
【问题讨论】: