【问题标题】:how to efficiently match two data tables in R如何有效地匹配R中的两个数据表
【发布时间】:2016-05-06 01:31:50
【问题描述】:

情况: 我有一个 CSV 文件 A 有两列 Customer IDEntry dateA 包含大约 1.500.000 个观测值。

我有另一个 CSV 文件 B,其中有一列 Customer IDBA 的一个较小的子集。

目标: 由于表B 中缺少有关他们进入日期的信息,我想从表A 中获取该信息并将其全部写入一个新表C

当前进度: 我从A 创建了 10 个子集 S1、...、S10,并从每个子集中创建了最大客户 ID。在for 循环中,我遍历B 的所有条目并检查B 是否位于其中一个子集中(通过子集的customer IDmax c ID)。一旦我找到了一个我应该在其中找到客户 ID 的子集,我就使用函数 which 在 A 中查找 B 的元素。

这太慢了。

没有其他更快的方法吗?

哪些是 R 中使用 CSV 文件的最佳对象,因为目前,A 是一个数据框B 是一个大整数.

【问题讨论】:

  • merge(甚至更快的 data.table 或 dplyr 连接)。
  • Duh :D 非常感谢 - 这就是我想要的 :)))
  • 这是合并的前兆,但如果 B 是整数,A[A$CID %in% B, ] 将起作用,并且 CID 是 A 中您的客户 ID 所在的列。使用数据表,您可以与setDT(A); setkey(A,CID); A[J(B)] 进行显式“合并”
  • @blueeyes0710 - 我发现这个data.table cheat sheet 在学习这个非常强大的软件包时很有用

标签: r match


【解决方案1】:

使用data.tablefread 读取您的CSV 文件:

library(data.table);
table_a <- fread("A.csv");  # Defaults are probably fine
table_b <- fread("B.csv");

使用merge使用B中的索引创建C:

# Assuming the column name has an underscore instead of space
setkey(table_a, Customer_ID);
setkey(table_b, Customer_ID);

table_c <- merge(x=table_b, y=table_a, by="Customer_ID", all.x=TRUE);

如果需要,将新表写入 CSV:

write.csv(x=table_c, file="C.csv");

【讨论】:

  • 蓝眼睛 - 不要忘记为“data.table”设置键以提高速度
  • 确实如此。 setkey 很重要!
【解决方案2】:

我会使用data.table。执行此操作非常简单(请参阅最后一个命令!),并且使用所谓的键控连接非常快。基本上,您使用它们的公共密钥(在您的情况下为"Customer ID")在a 中查找来自b 的条目。举个例子:

require(data.table)
a <- data.table(id=1:10,date=as.Date(1:10))
setkey(a,id)
b <- data.table(id=4:6)
setkey(b,id)

a[b]
#   id       date
#1:  4 2016-02-01
#2:  5 2016-02-02
#3:  6 2016-02-03

在您给定的示例中,您可以键入以下内容,以读取您的数据并进行键控连接以获取表 b 中每个人的进入日期:

a <- fread( "A.csv" )
setkey(a, "Customer ID")
b <- fread( "B.csv" )
setkey(a, "Customer ID")

c <- a[b]

【讨论】:

  • 你也可以简单地做a[b, on='id'](除此之外非常明确)而不使用setkey
猜你喜欢
  • 2020-07-24
  • 2019-09-02
  • 1970-01-01
  • 2019-12-04
  • 2021-10-06
  • 1970-01-01
  • 2018-08-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多