Vlookup与R中的data.table
首先,让我们从DataTable 1(DF1)开始: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(
在这种情况下,我将使用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