【发布时间】:2013-03-24 00:59:45
【问题描述】:
我在尝试使用 data.table 和 rep 按组复制一些数据时遇到了一些内存分配问题。
这是一些示例数据:
ob1 <- as.data.frame(cbind(c(1999),c("THE","BLACK","DOG","JUMPED","OVER","RED","FENCE"),c(4)),stringsAsFactors=FALSE)
ob2 <- as.data.frame(cbind(c(2000),c("I","WALKED","THE","BLACK","DOG"),c(3)),stringsAsFactors=FALSE)
ob3 <- as.data.frame(cbind(c(2001),c("SHE","PAINTED","THE","RED","FENCE"),c(1)),stringsAsFactors=FALSE)
ob4 <- as.data.frame(cbind(c(2002),c("THE","YELLOW","HOUSE","HAS","BLACK","DOG","AND","RED","FENCE"),c(2)),stringsAsFactors=FALSE)
sample_data <- rbind(ob1,ob2,ob3,ob4)
colnames(sample_data) <- c("yr","token","multiple")
我想要做的是将令牌(按当前顺序)复制为每年的倍数。
以下代码有效,并给出了我想要的答案:
good_solution1 <- ddply(sample_data, "yr", function(x) data.frame(rep(x[,2],x[1,3])))
good_solution2 <- data.table(sample_data)[, rep(token,unique(multiple)),by = "yr"]
问题在于,当我将其扩展到 40 毫米以上的行时,两种可能的解决方案都会出现内存问题。
如果我的理解是正确的,这些解决方案本质上是在做一个每次都分配的 rbind。
谁有更好的解决方案?
我查看了 data.table 的 set(),但遇到了问题,因为我想在每次复制时保持令牌的顺序相同。
【问题讨论】:
-
从 1.9.2 版开始。 (在 CRAN 2014 年 2 月 27 日),
data.table获得了一个新函数setDT(),它采用list或data.frame并通过引用data.table来更改其类型,没有任何副本 .因此,setDT(sample_data)而不是data.table(sample_data)可能有助于节省内存。
标签: r data.table replicate