如何有效地合并两个数据集?

2023-12-28

我正在尝试通过一个通用 ID 合并两个相当大的数据集(但不是大得离谱(360,000 X 4, 57,000 X 4))。我尝试过常规的merge(), merge.data.table(), and sqldf()。每次我总是内存不足(cannot allocate vector of size...)。有什么办法解决这个问题吗?或者 R 是一个糟糕的数据合并工具吗?head()下面给出(我正在尝试合并 STUDENT.NAME):

  ID10    STUDENT.NAME   FATHER.NAME MOTHER.NAME
1    1     DEEKSHITH J       JAYANNA      SWARNA
2    4    MANIKANTHA D       DEVARAJ     MANJULA
3    5        NAGESH T   THIMMAIAH N    SHIVAMMA
4    6    NIZAMUDDIN R NOOR MOHAMMED        BIBI
5    7 PRABHU YELLAPPA      YELLAPPA    MALLAMMA
6    8    SADDAM PASHA   NISAR AHMED     ZAREENA

从您的问题的性质来看,您肯定正在进行多对多合并,其中每个学生在每个数据帧中出现多次。您可能想检查多少次。如果每个学生在每个数据框中出现两次,则意味着一名学生将生成 4 行。如果某个学生出现 10 次,则合并将添加 100 行。首先检查您将获得多少行。这是我使用的函数:

count.rows <- function(x,y,v,all=FALSE){
    tx <- table(x[[v]])
    ty <- table(y[[v]])
    val <- val <- names(tx)[match(names(tx),names(ty),0L) > 0L]
    cts <- rbind(tx[match(val,names(tx))],ty[match(val,names(ty))])
    colnames(cts) <- val
    sum(apply(cts,2,prod,na.rm=all),na.rm=TRUE)
}
count.rows(DF1,DF2,"STUDENT.NAME")

如果您按照您要求的去做(阅读 R 文档),您会发现复杂性取决于答案的长度。这不是由于合并算法本身,而是所有结果绑定在一起。如果您确实想要一个内存消耗较少的解决方案,那么您特别需要摆脱该绑定。以下算法可以为您做到这一点。我把它写出来,方便大家找到逻辑,也可以优化。请注意,它不会给出相同的结果,它会复制all两个数据帧的列。所以你可能想稍微调整一下。

mymerge <- function(x,y,v,count.only=FALSE){
    ix <- match(v,names(x))
    iy <- match(v,names(y))

    xx <- x[,ix]
    yy <- y[,iy]
    ox <- order(xx)
    oy <- order(yy)
    xx <- xx[ox]
    yy <- yy[oy]

    nx <- length(xx)
    ny <- length(yy)

    val <- unique(xx)
    val <- val[match(val,yy,0L) > 0L]
    cts <- cbind(table(xx)[val],table(yy)[val])
    dimr <- sum(apply(cts,1,prod),na.rm=TRUE)

    idx <- vector("numeric",dimr)
    idy <- vector("numeric",dimr)
    ndx <- embed(c(which(!duplicated(xx)),nx+1),2)[unique(xx) %in% val,]
    ndy <- embed(c(which(!duplicated(yy)),ny+1),2)[unique(yy) %in% val,]

    count = 1
    for(i in 1:nrow(ndx)){
        nx <- abs(diff(ndx[i,]))
        ny <- abs(diff(ndy[i,]))
        ll <- nx*ny

        idx[count:(count+ll-1)] <-
          rep(ndx[i,2]:(ndx[i,1]-1),ny)

        idy[count:(count+ll-1)] <-
          rep(ndy[i,2]:(ndy[i,1]-1),each=nx)
        count <- count+ll
    }
    x <- x[ox[idx],]
    names(y) <- paste("y.",names(y),sep="")
    x[names(y)] <- y[oy[idy],]
    rownames(x) <- 1:nrow(x)
    x
}

一些测试代码,以便您可以看到它的工作原理:

DF1 <- data.frame(
    ID = 1:10,
    STUDENT.NAME=letters[1:10],
    SCORE = 1:10
)
id <- c(3,11,4,6,6,12,1,4,7,10,5,3)
DF2 <- data.frame(
    ID = id,
    STUDENT.NAME=letters[id],
    SCORE = 1:12
)

mymerge(DF1,DF2,"STUDENT.NAME")

对两个 50 万行和 4 列的数据帧执行相同的操作,每个学生姓名最多 10 个匹配项,它返回一个具有 580 万行和 8 列的数据帧,并在内存中给出以下图片:

黄色框是 merge 调用,绿色框是 mymerge 调用。内存范围从 2.3Gb 到 3.74Gb,因此合并调用使用 1.45Gb,mymerge 略多于 0.8Gb。仍然没有“内存不足”错误...测试代码如下:

Names <- sapply(
      replicate(120000,sample(letters,4,TRUE),simplify=FALSE),
      paste,collapse="")

DF1 <- data.frame(
    ID10 = 1:500000,
    STUDENT.NAME = sample(Names[1:50000],500000,TRUE),
    FATHER.NAME = sample(letters,500000,TRUE),
    SCORE1 = rnorm(500000),
    stringsAsFactors=FALSE
)

id <- sample(500000,replace=TRUE)
DF2 <- data.frame(
    ID20 = DF1$ID10,
    STUDENT.NAME = DF1$STUDENT.NAME[id],
    SCORE = rnorm(500000),
    SCORE2= rnorm(500000),
    stringsAsFactors=FALSE
)
id2 <- sample(500000,20000)
DF2$STUDENT.NAME[id2] <- sample(Names[100001:120000],20000,TRUE)

gc()
system.time(X <- merge(DF1,DF2,"STUDENT.NAME"))
Sys.sleep(1)
gc()
Sys.sleep(1)
rm(X)
gc()
Sys.sleep(3)
system.time(X <- mymerge(DF1,DF2,"STUDENT.NAME"))
Sys.sleep(1)
gc()
rm(X)
gc()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何有效地合并两个数据集? 的相关文章

  • 在 C 中复制两个相邻字节的最快方法是什么?

    好吧 让我们从最明显的解决方案开始 memcpy Ptr const char a b 2 调用库函数的开销相当大 编译器有时不会优化它 我不会依赖编译器优化 但即使 GCC 很聪明 如果我将程序移植到带有垃圾编译器的更奇特的平台上 我也不
  • 如何绘制堆积比例图?

    我有一个数据框 x lt data frame id letters 1 3 val0 1 3 val1 4 6 val2 7 9 id val0 val1 val2 1 a 1 4 7 2 b 2 5 8 3 c 3 6 9 我想绘制一个
  • 从 df 中提取具有两列的重叠行对

    我想找出这两个表之间哪些对重叠 gt dput data1 structure list Name x c MDH1 MDH1 IDH2 IDH2 IDH2 IDH2 IDH2 IDH2 IDH2 SCOALB SCOALB CSY4 CS
  • R- 将某些列从 0 标准化为 1,其值等于 0

    我最近开始使用 are 我想扩展我的数据矩阵 我在这里找到了一种方法在两点之间缩放系列 https stackoverflow com questions 5468280 scale a series between two points
  • 使用大矩阵操作

    我必须使用 big matrix 对象 并且无法计算某些函数 让我们考虑以下大矩阵 create big matrix object x lt as big matrix matrix sample 1 10 20 replace TRUE
  • 如何使用 R 将每个文件的数据添加为附加行,从而将不同的 .csv 文件合并为一个完整的文件?

    我有几个不同的文件夹 它们都包含一个 csv 文件 所有这些 csv 文件都有一个单独的列 其中包含实验的一种条件的数据 我想以将每个文件的数据添加为新列的方式合并这些 csv 文件 目前 它看起来像这样 C1 csv 102 106 15
  • R 中按时间划分的平均值

    我每秒测量一次化合物浓度 我想求 30 秒和 60 秒的平均值 我一直在阅读这里的帖子 我尝试过lubridate and dplyr 但没有运气 我正在努力完成这项工作 但我一直没能做到 我正在从 SAS 过渡到 R 所以请耐心等待 这是
  • 从日期变量创建月末日期

    我有一个包含日期变量的大型数据框 它反映了该月的第一天 有没有一种简单的方法来创建代表该月最后一天的新数据框日期变量 以下是一些示例数据 date start month seq as Date 2012 01 01 length 4 by
  • 如何添加链接以从我的 R闪亮应用程序在新窗口中打开 pdf 文件?

    我可以使用 a 从我的 Shiny 应用程序添加到外部站点的超链接 a google href http www google com 但如何创建一个链接来打开 pdf 或类似 文件 看起来应该很简单 但我找不到任何例子 我的问题与此类似
  • 在 Haskell 中合并两个列表

    无法弄清楚如何合并两个列表通过以下方式在哈斯克尔 INPUT 1 2 3 4 5 11 12 13 14 OUTPUT 1 11 2 12 3 13 4 14 5 我想提出一个更懒的合并版本 merge ys ys merge x xs y
  • R中的字典数据结构

    在 R 中 我有 例如 gt foo lt list a 1 b 2 c 3 如果我输入foo I get a 1 1 b 1 2 c 1 3 我怎样才能看透foo仅获取 键 列表 在这种情况下 a b c R 列表可以具有命名元素 因此可
  • 将字符串列拆分为多个虚拟变量

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

    我有以下数据框 id channel 1 a 1 b 1 c 2 a 2 c 3 a 我想创建并重叠矩阵 它基本上是一个方阵 行和列标签为 a b c 表中的每个条目显示每个通道共有多少个 id 例如 在上面的例子中 矩阵看起来像 a b
  • R - 计算 bin 中特定值的数量

    我有一个如下所示的数据框 df Value lt c 1 1 0 2 1 3 4 0 0 1 2 0 3 0 4 5 2 3 0 6 Sl lt c 1 20 df lt data frame Sl Value gt df Sl Value
  • purrr::可能函数可能无法与map2_chr函数一起使用

    我怀疑这是 purrr 包中的错误 但想先在 StackOverflow 中检查我的逻辑 在我看来 possibly功能在内部不起作用map2 chr功能 我正在使用 purrr 版本 0 2 5 考虑这个例子 library dplyr
  • 访问或解析 R 中的 summary() 中的元素

    我运行以下 R 命令来进行 Dunnett 测试并获取摘要 如何访问下面线性假设的每一行 这是摘要输出的一部分 基本上我不知道摘要的结构 我尝试使用名称 但它似乎不起作用 因为我没有看到任何命名属性来提供这一点 library multco
  • 不同编程语言中的浮点数学

    我知道浮点数学充其量可能是丑陋的 但我想知道是否有人可以解释以下怪癖 在大多数编程语言中 我测试了 0 4 到 0 2 的加法会产生轻微的错误 而 0 4 0 1 0 1 则不会产生错误 两者计算不平等的原因是什么 在各自的编程语言中可以采
  • 如何在 data.table 中分组后使用条件计算行数

    我有以下数据框 dat lt read csv s1 s2 v1 v2 a b 10 20 a b 22 NA a b 13 33 c d 3 NA c d 4 5 NA c d 10 20 dat gt A tibble 6 x 4 gt
  • Pandas 将多行列数据帧转换为单行多列数据帧

    我的数据框如下 code df Car measurements Before After amb temp 30 268212 26 627491 engine temp 41 812730 39 254255 engine eff 15
  • 如何在 Shiny 中提取动态生成的输入值?

    我正在创建一个闪亮的应用程序 它将根据客户的不同功能为客户生成分数 在我闪亮的应用程序中 我提供了 checkboxGroupInput 来选择所需的功能 根据所选功能 应用程序将动态地将 numericInput 添加到 Web ui 以

随机推荐

  • Elasticsearch:在分面时排除过滤器可能吗? (就像在 Solr 中一样)

    我正在考虑从 Solr 更改为 ES 我找不到相关信息的一件事是 ES 是否允许我在分面时定义排除过滤器 例如考虑producttype具有值 A B C我想关注这一点 即 显示计数 还要考虑查询被限制为producttype A 在这种情
  • 无法将参数 1 从“char”转换为“LPCWSTR”

    我不断收到此错误 cannot convert parameter 1 from char to LPCWSTR int main int argc char argv open port for I O HANDLE h CreateFi
  • 关于 printf 参数的问题。 C/C++

    我们有以下代码片段 char tab 2 3 1 2 0 3 4 0 printf s n tab 我不明白为什么我们在调用时没有收到错误 警告printf 我确实收到警告 但没有收到错误 并且程序运行良好 它打印 12 printf期待一
  • 如何使用 youtube-v3-api 对评论进行评分?

    youtube v3 api 支持评论评论吗 我看到了如何评价视频 但没有看到如何评价评论 None
  • Rails 错误 UsersController 中的 NoMethodError#show error

    undefined method key for nil NilClass 这是我在阅读 M Hartl 的 Rails 教程时遇到的错误 另外 保存我的 user controller rb 文件并刷新后http localhost 30
  • OWIN Startup 类与 WebAPIConfig.Register 方法一起执行

    我在用Microsoft Owin Hosting在我的集成测试项目之一中 自托管 Web API 以测试端到端功能 TestMethod public void GetLoanApplications using WebApp Start
  • 创建一个正则表达式来验证用户名

    我编写此代码是为了验证用户名是否满足给定条件 有人知道如何将 2 个正则表达式合并为一个吗 代码是c
  • 递归获取目录大小

    是否有一个好的 gem 可以获取递归计算的目录大小 在unix中 我可以使用du 但我想要一个能够吸收操作系统之间差异的库 这似乎有效 Dir glob File join dir map f File size f inject
  • 为什么使用QStringLiteral?

    我最近开始使用 QML 并尝试遵循这个例子 https www youtube com watch v 9BcAYDlpuT8 该视频介绍了如何创建可在 QML 应用程序中显示的 C 模型 在模型的数据成员函数中 使用了一个开关 并且将在
  • 如何使用avg函数?

    我是 php 和 mysql 的新手 我正在尝试使用 avg 函数 但我不知道该怎么做 我正在尝试做这样的事情 mysql connect localhost username password mysql select db databa
  • 如何在不保存检查点的情况下运行 estimator.train

    我正在寻找一种方法来实现学习率搜索 如下所述 https arxiv org pdf 1506 01186 pdf https arxiv org pdf 1506 01186 pdf 我的网络是使用估算器 api 实现的 我想坚持这一点
  • 在mono中,如何控制SSL/TLS密码套件?

    我想将服务器配置为拒绝 DES RC4 MD5 等的协商 单声道 3 4 发行说明 http www mono project com Release Notes Mono 3 4说 网络堆栈现在允许开发人员控制哪些密码套件与 TLS SS
  • 异常代码:0xe0434f4d [重复]

    这个问题在这里已经有答案了 我在尝试运行 Windows 应用程序时遇到以下错误 错误应用程序名称 cribbageDemo exe 版本 1 0 0 0 时间戳 0x4f685fe3 错误模块名称 KERNELBASE dll 版本 6
  • 可扩展列表视图中的 Android 数据绑定

    我有一个非常具体的问题 我正在使用 android 数据绑定库 https developer android com topic libraries data binding index html https developer andr
  • LINQ-实体日期部分[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我有一种方法可以获取 linq to
  • 模拟:ASP.Net MVC 控制器操作与 Web 表单

    ASP Net MVC 控制器操作与 ASP Net Web 表单之间的模拟有区别吗 在同一个 Web 项目中使用完全相同的代码 当从 Web 表单连接到 SQL Server 时 我能够成功模拟 Windows 用户 但不能从控制器操作连
  • 从独立应用程序运行加特林的正确方法是什么

    我需要从主应用程序启动加特林模拟 用例如下 应用程序读取规范 并根据该规范生成测试用例 测试用例被转换为加特林场景 这些场景在加特林模拟中运行 到目前为止 我设法通过 sbt 插件做到这一点 然而 如果我们想在其他上下文中重用我正在开发的工
  • 视图控制器类的出口应该是弱还是强?操作系统应用程序

    这就是我所做的 制作一个干净的 OSX 项目 转到 main xib 并拖动弹出控制器 这在界面生成器上创建了 2 个可见对象 我去了 appDelegate h 文件并做了 属性 assign IBOutlet NSViewControl
  • 如何使用 `boost::spirit` 将语法解析为 `std::set`?

    TL DR 如何解析 a 的结果boost spirit语法转化为std set 完整的问题陈述 作为学习如何使用的练习boost spirit 我正在为 X 500 LDAP 可分辨名称设计一个解析器 语法可以在 BNF 格式中找到RFC
  • 如何有效地合并两个数据集?

    我正在尝试通过一个通用 ID 合并两个相当大的数据集 但不是大得离谱 360 000 X 4 57 000 X 4 我尝试过常规的merge merge data table and sqldf 每次我总是内存不足 cannot alloc