基于2列值合并 - 检查重复键值错误

时间:2015-04-14 20:14:13

标签: r merge data.table

我有两个数据表,其中包含以下列:ddate,fnumber,file,modelfnumber,ddate,model,model_id,file。我想使用与ddatefnumber列匹配的第二个表中的值更新第一个表。

如果我使用merge

dtPT <- merge(dtPT, dtAT, by = c("fnumber", "ddate"), all.x = TRUE)

然后我收到以下错误 -

  

vecseq中的错误(f __,len __,if(allow.cartesian || notjoin)NULL else   as.integer(max(nrow(x),: Join结果为8568291行;超过   8537179 = max(nrow(x),nrow(i))。检查i中的重复键值,   每个都一遍又一遍地加入x中的同一组。如果   没关系,请尝试包含j并删除by(by-without-by)以便   j为每个组运行以避免大量分配。如果你确定的话   您希望继续,请使用allow.cartesian = TRUE重新运行。除此以外,   请在FAQ,Wiki,Stack Overflow中搜索此错误消息   和数据表 - 帮助提供建议。

我尝试在dtAT中搜索重复的记录:

setkeyv(dtAT, c("fnumber", "ddate"))
dtAT[duplicated(dtAT)]

但它返回0行。

我也尝试使用match,但它没有像我预期的那样工作(示例数据在下面使用):

tPT <- "ddate,fnumber,file,model
2014-05-26,S71149,ps1.csv,320
2014-09-26,,ps2.csv,
2014-10-16,,ps3.csv," 

tAT <- 
"fnumber,ddate,model,model_id,file
S71149,2014-05-26,319,VU-BHP,as1.csv
S71149,2014-05-25,320,,as2.csv
S71149,2014-05-23,322,VU-BTP,as3.csv"

columnClasses <- c("POSIXct", "factor", "character", "factor")
dtPT <- read.csv(text=tPT, header = TRUE, sep = ",", na.strings = c(""), colClasses = columnClasses)
dtPT <- as.data.table(dtPT)

columnClasses <- c("character", "POSIXct", "character", "factor", "factor")
dtAT <- read.csv(text=tAT, header = TRUE, sep = ",", na.strings = c(""), colClasses = columnClasses)
dtAT <- as.data.table(dtAT)

dtPT$model_code <- dtAT[match(paste(dtAT$fnumber, dtAT$ddate), paste(dtPT$fnumber, dtPT$ddate)), dtAT$model] 

结果中的上述代码会将model_code值分配给所有行:

        ddate fnumber    file model model_code
1: 2014-05-26  S71149 ps1.csv   320        319
2: 2014-09-26      NA ps2.csv    NA        320
3: 2014-10-16      NA ps3.csv    NA        322

320应分配给第一行时:

        ddate fnumber    file model model_code
1: 2014-05-26  S71149 ps1.csv   320        319
2: 2014-09-26      NA ps2.csv    NA         NA
3: 2014-10-16      NA ps3.csv    NA         NA

由于对于第二行和第三行,ddatefnumber的组合不匹配。

merge当然适用于下面的示例,但会返回生产数据中的错误)

0 个答案:

没有答案