我有两个数据表,其中包含以下列:ddate,fnumber,file,model
和fnumber,ddate,model,model_id,file
。我想使用与ddate
和fnumber
列匹配的第二个表中的值更新第一个表。
如果我使用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
由于对于第二行和第三行,ddate
和fnumber
的组合不匹配。
(merge
当然适用于下面的示例,但会返回生产数据中的错误)