我正在尝试基于我创建的名为“lookup”的公共字段合并到数据框。我在对原始数据帧进行子集化后创建了数据帧。 两个新创建的数据帧中的每一个都少于10,000行。在尝试执行合并时,经过深思熟虑后,R和R Studio都会关闭,R有时会产生错误消息,说明:
make.unique中的错误(as.character(rows)): 承诺已经在评估中:递归默认参数引用还是早期问题?
下面是我的代码...除了使用合并功能之外,还有其他方法可以根据公共字段从其他数据框中下载数据吗?任何帮助表示赞赏。
此外,你有没有想过为什么它可能会关闭,耗尽所有内存,实际上,当数据量太小时?
wmtdata <- datastep2[datastep2$Market.Type=="WMT", c("Item", "Brand.Family", "Brand", "Unit.Size", "Pack.Size",
"Container", "UPC..int.", "X..Vol", "Unit.Vol", "Distribution", "Market.Type",
"Week.Ending", "MLK.Day","Easter", "Independence.Day", "Labor.Day", "Veterans.Day", "Thanksgiving",
"Christmas", "New.Years","Year","Month","Week.Sequence","Price")]
compdata <- datastep2[datastep2$Market.Type=="Rem Mkt", c("Week.Ending", "UPC..int.","X..Vol", "Unit.Vol", "Price","lookup")]
colnames(compdata)[colnames(compdata)=="X..Vol"]<-"Comp Vol"
colnames(compdata)[colnames(compdata)=="Unit.Vol"]<-"Comp Unit Vol"
colnames(compdata)[colnames(compdata)=="Price"]<-"Comp Price"
combineddata <-merge(wmtdata, compdata, by="lookup")
答案 0 :(得分:1)
使用 data.table 包(see here for an intro),而不是使用数据框。 data.table就像一个索引数据框。它有自己的合并方法,在这种情况下可能会起作用。
答案 1 :(得分:1)
从join
包中尝试plyr
:
combineddata <- join(wmtdata, compdata, by="lookup")
答案 2 :(得分:1)
只有10,000行,问题不大可能是使用merge(...)
而不是其他东西。 lookup
列的元素是否唯一?否则你会得到一个交叉连接。
考虑一下这个简单的案例:
df.1 <- data.frame(id=rep(1,10), x=rnorm(10))
df.2 <- data.frame(id=rep(1,10), y=rnorm(10))
z <- merge(df.1,df.2,by="id")
nrow(z)
# [1] 100
因此,两个df
共10行会产生100行合并,因为id不是唯一的。
现在考虑:
df.1 <- data.frame(id=rep(1:10, each=40), x=rnorm(400))
df.2 <- data.frame(id=rep(1:10, each=50), y=rnorm(500))
z <- merge(df.1,df.2,by="id")
nrow(z)
# [1] 20000
在此示例中,df.1
每个ID都会复制40次,而df.2
每个ID都会复制50次。合并将为每个df 中的每个id实例生成一行,因此50 x 40 = 2000行每个ID 。由于此示例中有10个ID,因此您将获得20,000行。因此,如果id字段(在您的情况下为lookup
)不是唯一的,那么您的合并结果会非常快。
答案 3 :(得分:1)
谢谢大家的帮助。数据表是我的方式,因为我认为这是一个内存问题(“查找”值在数据帧之间很常见)。虽然8 GB的内存(约6 GB免费)应该足够,但在此过程中它们都已耗尽。尽管如此,数据表工作得很好。从这些董事会中学到很多东西。