从两列映射中对多对多关系进行分组

2023-12-08

我有一个 SQL 表,可以映射作者和书籍等内容。我想将链接的作者和书籍(同一作者撰写的书籍以及共同撰写一本书的作者)分组在一起,并确定这些组的规模有多大。例如,如果 J.K.罗琳与朱诺·迪亚兹合写,朱诺·迪亚兹与扎迪·史密斯合写了一本书,那么我希望这三位作者都在同一组。

这是一个玩具数据集(h/t Matthew Dowle),其中包含我正在谈论的一些关系:

set.seed(1)
authors <- replicate(100,sample(1:3,1))
book_id <- rep(1:100,times=authors)
author_id <- c(lapply(authors,sample,x=1:100,replace=FALSE),recursive=TRUE)
aubk <- data.table(author_id = author_id,book_id = book_id)
aubk[order(book_id,author_id),]

在这里可以看到作者 27 和 36 共同撰写了第二本书,因此他们应该属于同一组。作者 63 和 3 的作者 100 也是如此; 4 为 D、F 和 L。依此类推。

除了 for 循环之外,我想不出有什么好方法来做到这一点,因为 for 循环(正如你可以猜到的)很慢。我尝试了一点data.table以避免不必要的复制。有更好的方法吗?

aubk$group <- integer(dim(aubk)[1])
library(data.table)
aubk <- data.table(aubk)
#system.time({
for (x in 1:dim(aubk)[1]) {
    if(identical(x,1)) {
        value <- 1L
    } else {
        sb <- aubk[1:(x-1),]
        index <- match(aubk[x,author_id],sb[,author_id])
        if (identical(index,NA_integer_)) {
            index <- match(aubk[x,book_id],sb[,book_id])
            if (identical(index,NA_integer_)) {
                value <- x
            } else {
                value <- aubk[index,group]
            }
        } else {
            value <- aubk[index,group]
        }
    }
    aubk[x,group:=value]
}
#})

EDIT:正如 @Josh O'Brien 和 @thelatemail 所提到的,我的问题也可以表述为从两列列表中查找图形的连接组件,其中每条边都是一行,两列是连接的节点。


将 500K 个节点转换为邻接矩阵对于我的计算机内存来说太大了,所以我无法使用igraph. The RBGLR 版本 2.15.1 的包没有更新,所以它也被淘汰了。

在编写了很多似乎不起作用的愚蠢代码之后,我认为以下内容可以让我得到正确的答案。

aubk[,grp := author_id]
num.grp.old <- aubk[,length(unique(grp))]
iterations <- 0
repeat {
    aubk[,grp := min(grp),by=author_id]
    aubk[,grp := min(grp), by=book_id]
    num.grp.new <- aubk[,length(unique(grp))] 
    if(num.grp.new == num.grp.old) {break}
    num.grp.old <- num.grp.new
    iterations <- iterations + 1
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从两列映射中对多对多关系进行分组 的相关文章

  • 如何对数字进行四舍五入并使其显示零?

    R 中将数字四舍五入到小数点后 2 位的常用代码是 gt a 14 1234 gt round a digits 2 gt a gt 14 12 但是 如果该数字的前两位小数位为零 则 R 会在显示中抑制零 gt a 14 0034 gt
  • 将字符串列拆分为多个虚拟变量

    作为 R 中 data table 包的相对缺乏经验的用户 我一直在尝试将一个文本列处理为大量指示符列 虚拟变量 每列中的 1 表示特定的子字符串是在字符串列中找到 例如我想处理这个 ID String 1 a b 2 b c 3 c 进入
  • Quantmod 的简单功能不再起作用

    我明天要交论文 我收到了一条关于 quantmod 的非常奇怪的错误消息 这是我在过去几周使用这个包时从未遇到过的 我无法导入特定于道琼斯指数 DJI 的数据 我收到以下错误消息 getSymbols DJI src yahoo from
  • R 中两个时间戳之间的左连接

    我的目标是执行左连接intervals哪里的bike id比赛和created at时间戳在records在 之间start and end in the intervals table gt class records 1 data ta
  • R 闪亮仪表板中的动态重复条件面板

    我正在尝试创建一个动态条件面板 所以我的条件如下 在用户界面中输入 selectInput inpt Input Number seq 1 50 1 selectize FALSE 我的条件面板 UI 输入是 conditionalPane
  • 警告消息 - 来自 dummies 包的 dummy

    我正在使用 dummies 包为分类变量生成虚拟变量 其中一些变量具有两个以上类别 testdf lt data frame A as factor c 1 2 2 3 3 1 B c A B A B C C C c D D E D D E
  • 绘制 Cox 回归的 Kaplan-Meier 图

    我使用 R 中的以下代码设置了一个 Cox 比例风险模型来预测死亡率 添加协变量 A B 和 C 只是为了避免混淆 即年龄 性别 种族 但我们真正对预测变量 X 感兴趣 X 是一个连续变量 cox model lt coxph Surv t
  • 如何纠正 data.frame 上的字符编码

    我有一个像这样的数据框 data names lt data frame DATA c 1 5 rownames data names lt c IV xc1N JOS xc9 LUC xcdA RAM xd3N TO xd1O data
  • 如何在 R 中执行近似(模糊)名称匹配

    我有一个专门用于生物学期刊的大型数据集 该数据集是由不同的人长时间编写的 因此 数据不采用单一格式 例如 在 作者 栏中我可以找到John Smith Smith John Smith J等 但它们是同一个人 我连最简单的动作都做不了 例如
  • 更新 R6 对象实例中的方法定义

    如何更新 R6 类实例的方法定义 正如我所期望的 S3 使用当前的方法定义 对于 R5 参考类 我可以使用 myInstance myInstance copy 在 R6 中 我尝试了 myInstance myInstance clone
  • 在 RcppArmadillo 中将列向量乘以数值标量

    我在编译这个简单的程序时遇到一些麻烦c 代码使用Rcpp和RcppArmadillo包裹 采用以下简单示例 将矩阵的每一列乘以数值标量 code lt arma mat out Rcpp as
  • 在 R 的 for 循环中创建动态命名对象并分配动态值

    我正在尝试创建一套动态命名的新对象 例如 temp2015 使用 for 循环 并存储动态值 具体来说 其他对象的名称 例如 Y2015 和 for 循环中使用的值 例如 2015 在动态命名的新对象中 我不确定为什么下面的代码不起作用 Y
  • R - 重塑 - 熔化错误

    我正在尝试融化数据框 但出现了这个奇怪的错误 有什么想法吗 str zx7 data frame 519 obs of 5 variables calday new Date format 2011 01 03 2011 01 04 201
  • 如何按定义的顺序将图像合并到一个文件中

    我有大约 100 张图像 png 我不想手动执行此操作 而是希望将它们按照定义的顺序 基于文件名 并排放置在一个 pdf 中 每行 12 个图像 有人有什么建议吗 我按照下面托马斯告诉我的方法尝试了 它把它们贴在旁边有一个黑边 我怎样才能去
  • 在 R 中提取 data.frames 列表的名称以及 data.frame 中的值

    在下面的代码中 j是 data frames 的命名列表 我想知道是否有办法 a 提取变量的数值 即one short and one long 在 data frames 内并附加它们的相关名称 即 AAA or BBB or CCC 到
  • 在 RMarkdown 输出到 PDF 时缩进而不添加项目符号点或编号

    之前有人问过如何在没有项目符号的情况下缩进文本 RMarkdown 中的点 但这是针对 HTML 输出的 在 RMarkdown 中缩进而不添加项目符号点或数字 https stackoverflow com questions 47087
  • R:按组,测试一个变量的每个值是否存在于另一个变量中

    我有一个数据框架 结构如下 a lt c 1 1 1 2 2 2 3 3 3 3 4 4 b lt c 1 2 3 1 2 3 1 2 3 4 1 2 c lt c NA NA 2 NA 1 1 NA NA 1 1 NA NA df lt
  • R中IF函数的使用

    我正在短跑ifR 中的函数 但收到以下警告消息 In if runif 50 0 1 lt 0 69 the condition has length gt 1 and only the first element will be used
  • 需要在R中跳过不同数量的行

    我正在使用以下代码来处理我的数据 但最近我意识到使用skip 27 在数据开始之前跳过存储在我的文件中的信息 不是一个好的选择 因为每个文件中要跳过的行数不同我的目标是读取存储在多个文件夹中的各种txt文件 并非所有文件都有相同的列数 列的
  • case_when 与部分字符串匹配和 contains()

    我正在使用一个数据集 其中有许多名为 status1 status2 等的列 在这些列中 它表示某人是否豁免 完整 注册等 不幸的是 豁免投入并不一致 这是一个示例 library dplyr problem lt tibble perso

随机推荐

  • 在 Python 中将参数传递给 subprocess.run() [重复]

    这个问题在这里已经有答案了 我正在尝试使用 subprocess run 将参数传递给我在 Python 中运行的 bash 脚本 它是一个循环 运行从列表中传递参数的命令 我正在使用 Twint 库 但这部分并不重要 我指出这一点是为了让
  • 为什么我无法更改 python 窗口图标?

    我想用代码更改 pygame 窗口图标 import pygame pygame init screen pygame display set mode 800 600 pygame display set caption Snake Ga
  • Adobe Air ios 打包程序

    限制解除后 关于将 Adob e Air 应用程序部署到 ios 似乎存在很多混乱 在苹果取消限制之前 您必须完成此处记录的流程 http blogs adobe com cantrell archives 2010 09 packager
  • Pandas:将重复索引更改为分层索引

    请参阅下面的示例 给定一个索引有重复值的数据帧 如何获得一个具有分层索引的新数据帧 其第一级是原始索引 第二级是 0 1 2 n Example gt gt gt df 0 1 a 2 4 a 4 6 b 7 8 b 2 4 c 3 7 g
  • 从静态方法访问非静态枚举值

    public enum sEnum zero 0 one 1 public int x public static void a sEnum s x 3 if s sEnum one 为什么可以在这里检查枚举的值 因为没有使用 static
  • 转至收藏联系人的 Intent URI

    是否有 Intent URI 可以将您发送到手机最喜爱的联系人 就像内容 联系人 人员 将您发送给所有联系人 并且tel 将您发送至拨号器 EDIT 还有一种方法可以转到您的通话记录吗 收藏夹 com android contacts ac
  • ECGraph 无法在设备上运行,但可以在模拟器上运行

    是否有任何原因导致 ECGraph 在模拟器上运行良好 但当我在我的设备上运行它时却出现此错误 2012 08 24 01 57 18 543 Portfolio 3538 907 NSCFCalendar components fromD
  • 单击时显示子类别

    在我的 WordPress 网站上 我有一个菜单 显示每个类别的子类别 我想要做的是默认隐藏子类别 仅当我单击父类别时才显示它们 My HTML ul class scrolling cat mCustomScrollbar mCS 2 m
  • 如何解码 JSON 字符串?

    在服务器端 我有 2 个哈希值编码成 JSON 字符串吗 my j JSON gt new j j gt utf8 my data data gt users j gt encode user result data gt owners j
  • 样式取决于 Xamarin 表单中的屏幕方向

    我在手机和平 板电脑上进行造型 但如何添加方向选项 这都是纵向的 但我如何添加水平方向的选项
  • 如何保护 Mongoose/MongoDB 中的密码字段,以便在填充集合时它不会在查询中返回?

    假设我有两个集合 模式 一个是带有用户名和密码字段的用户架构 然后 我有一个博客架构 它引用了作者字段中的用户架构 如果我用 Mongoose 做类似的事情 Blogs findOne populate user exec 我还将填充博客文
  • 如何从搜索栏和 UISearchDisplayController 的过滤结果中选择多个表行?

    我知道 UISearchDisplayController 在 iOS 8 0 中已被弃用 但关于新的 UISearchController 没有很多好的文档 所以我使用了前者 请容忍我 现在 我正在使用 XIB 文件 我知道对于常规表格视
  • PHP MySQL 的问题并插入 UTF-8 [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 我的 php 和 mysql 有问题 使用 utf 8
  • OneWayToSource 绑定在 .NET 4.0 中似乎已损坏

    OneWayToSource NET 4 0 中的绑定似乎已损坏 我有这个简单的 Xaml 片段
  • Dart 如何获取字符串形式的枚举名称

    在 Dart 中提供枚举之前 我编写了一些繁琐且难以维护的代码来模拟枚举 现在想要简化它 我需要以字符串形式获取枚举的名称 这可以用 Java 完成 但不能 例如 当我想要的是 MONDAY 时 小测试代码片段在每种情况下都会返回 day
  • 通过 Google Maps API v3 访问 ExtendedData 信息

    我有一个 KML 文件 其中包含每个
  • D3 强制布局:如何强制一组节点停留在给定区域

    在 D3 力布局图中 我尝试根据节点组强制某些节点留在给定区域 有一个中心节点 该节点是固定的 我希望由红线连接的节点保留在屏幕高度的前 1 3 处 由描边线连接的节点保留在第二个 1 3 处 由蓝线连接的节点保留在最后 1 3 处 但我希
  • 是否可以在 x 轴(经度)上移动 geopandas 世界地图?

    我想知道是否有一种方法可以将 geopandas 世界地图集中在特定的经度点上 基本上 只是想将其移动约 5 10 度左右 上一个问题是几个月前发布的 但没有收到答案 想知道是否有人知道解决方案 stackoverflow 上原始问题的链接
  • 循环遍历具有特定扩展名的所有文件并对其执行某些操作

    这是我第一次使用 Linux shell 脚本 它看起来确实很强大 但我仍然有点困惑 我想循环遍历目录中具有特定扩展名的所有文件递归地 所有子目录 子子目录和 并通过在它们上运行可执行文件在原始文件的确切位置生成一个具有相同名称但扩展名不同
  • 从两列映射中对多对多关系进行分组

    我有一个 SQL 表 可以映射作者和书籍等内容 我想将链接的作者和书籍 同一作者撰写的书籍以及共同撰写一本书的作者 分组在一起 并确定这些组的规模有多大 例如 如果 J K 罗琳与朱诺 迪亚兹合写 朱诺 迪亚兹与扎迪 史密斯合写了一本书 那