Vlookup与R中的data.table

Vlookup与R中的data.table,r,data.table,lookup,vlookup,R,Data.table,Lookup,Vlookup,首先,让我们从DataTable 1(DF1)开始: 在这种情况下,我将使用id查找名称。当我尝试合并时,我总是在DF1中有包含NA的新行。DF1这里有一个稍微不同的设置:我假设两个数据集的id都是唯一的,并且查找数据包含主数据集中存在的所有id DF1<-merge(DF1, lookup[,.(id, name)], by='id', all.x=TRUE, all.y=FALSE) 我只查找id和名称。为了确保查找中没有重复(多个日期),我使用了unique DF1[unique(

首先,让我们从DataTable 1(DF1)开始:


在这种情况下,我将使用id查找名称。当我尝试合并时,我总是在DF1中有包含NA的新行。

DF1这里有一个稍微不同的设置:我假设两个数据集的id都是唯一的,并且查找数据包含主数据集中存在的所有id

DF1<-merge(DF1, lookup[,.(id, name)], by='id', all.x=TRUE, all.y=FALSE)
我只查找id和名称。为了确保查找中没有重复(多个日期),我使用了
unique

DF1[unique(lookup[, .(id, name)]), on="id"][!is.na(sales)]

    id       date sales cost city  name
 1:  1 06/19/2016   149  101  MTL Bank1
 2:  1 06/20/2016   150  102  MTL Bank1
 3:  1 06/21/2016   151  104  MTL Bank1
 4:  1 06/22/2016   152  107  MTL Bank1
 5:  1 06/23/2016   155   99  MTL Bank1
 6:  2 06/19/2016    84   55   NY Bank2
 7:  2 06/20/2016    83   55   NY Bank2
 8:  2 06/21/2016    80   56   NY Bank2
 9:  2 06/22/2016    81   57   NY Bank2
10:  2 06/23/2016    97   58   NY Bank2

这称为左连接。我在末尾使用[!is.na()]删除主数据集中没有观测值的第3列和第4列。

在查找时,您需要开始和结束日期和状态,还是id和名称是足够的列?id和名称是足够的列,但是,在运行脚本之前,我不知道所有的列,但我确信我们将有一个列id和列日期。仅供参考,您应该使用
setnames
通过引用添加名称。无论如何,我认为您可以/应该只执行
DF1[lookup,on=“id”,name:=I.name]
@MaxMolina执行
x时,这是j中可用的一种特殊语法[i,on=,j]
在键入
?data.table时弹出的文档中的
j
参数下提到。还有一个
x.
前缀。在这种情况下,确保从
i=lookup
中提取列非常有用,而不是从
x=DF1
中已经存在的
name
列中提取列关于此语法在此处如何有用的更多信息:如果我将
allow.cartesian=TRUE
,当初始行数为83428时,我将有145368行。当我复制并粘贴您的前两个代码段以及我的答案时,它对我有效。您愿意在此处共享您的实际代码吗?您是否在库之后运行了我的合并命令(数据表)?它对我也有效,但当我尝试使用真实数据集时,我遇到了这个错误。是否存在两个银行名称共享一个id的情况?如果您的查找表中有一行id:2,名称:BANK2,另一行id:2,名称:BANK2,那么您将得到错误。如果是这个问题,您应该清理数据。我将所有银行n的大小写都降低ames和xThank谢谢你。通过使用你解的一部分和@Austin解,我能够得到我的答案。
DF1<-merge(DF1, lookup[,.(id, name)], by='id', all.x=TRUE, all.y=FALSE)
DF1[unique(lookup[, .(id, name)]), on="id"][!is.na(sales)]

    id       date sales cost city  name
 1:  1 06/19/2016   149  101  MTL Bank1
 2:  1 06/20/2016   150  102  MTL Bank1
 3:  1 06/21/2016   151  104  MTL Bank1
 4:  1 06/22/2016   152  107  MTL Bank1
 5:  1 06/23/2016   155   99  MTL Bank1
 6:  2 06/19/2016    84   55   NY Bank2
 7:  2 06/20/2016    83   55   NY Bank2
 8:  2 06/21/2016    80   56   NY Bank2
 9:  2 06/22/2016    81   57   NY Bank2
10:  2 06/23/2016    97   58   NY Bank2