情况:
我有一个包含两列A
和Customer ID
的CSV文件Entry date
。
A
包含大约1.500.000次观察。
我有另一个CSV文件B
,其中包含一列Customer ID
。
B
是A
的较小子集。
目标:
由于表B
中缺少有关其输入日期的信息,因此我希望从表A
获取该信息并将其全部写入新表C
。
当前进展:
我已经从A
创建了10个子集S1,...,S10,并从每个子集创建了最大客户ID。在for
循环中,我会遍历B
的所有条目,并检查B
是否位于其中一个子集中(通过子集的customer ID
和max c ID
)。一旦我找到了我应该找到客户ID的子集,我就使用函数 which
来查找A中B的元素。
这非常慢。
是不是还有另一种更快的方式?
哪个是R中使用CSV文件的最佳对象,因为目前A
是数据框,而B
是大整数
答案 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)