如何有效地匹配R中的两个数据表

时间:2016-01-28 15:26:33

标签: r match

情况: 我有一个包含两列ACustomer ID的CSV文件Entry 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大整数

3 个答案:

答案 0 :(得分:8)

我会使用data.table。这很简单(参见最后一个命令!),并且使用所谓的键控连接非常快。基本上,您使用公共密钥(在您的情况下为b)查找a"Customer ID"的条目。举个例子:

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]

答案 1 :(得分:2)

使用data.table的{​​{1}}来阅读fread个文件:

CSV

使用library(data.table); table_a <- fread("A.csv"); # Defaults are probably fine table_b <- fread("B.csv"); 使用B中的索引创建C:

merge

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

# 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);

答案 2 :(得分:0)

再一次拯救:

dfc <- 
    dfb %>%
    left_join(dfa)

整个脚本是:

library(dplyr)
# to keep factors from becoming an issue when the .csv are read in.
options(stringsAsFactors = FALSE)   

dfa <- read.csv("A.csv")
dfb <- read.csv("B.csv")

dfc <- 
    dfb %>%
    left_join(dfa)