【发布时间】:2013-06-19 16:03:44
【问题描述】:
我正在开发一个函数,该函数将具有相同列名的数据表列表作为输入,并返回单个数据表,其中包含使用连续 rbind 组合的每个数据帧的唯一行,如下所示。
该函数将应用于“非常”大的 data.table(数百万行),这就是为什么我必须将其拆分为几个较小的数据表并将它们分配到一个列表中以使用递归。在每一步,根据数据表列表的长度(奇数或偶数),我在该列表索引处找到 data.table 的唯一性,在列表索引 x - 1 处找到数据表,然后连续 rbind 2 并分配列出索引 x - 1,以及更多列出索引 x。
我一定遗漏了一些明显的东西,因为虽然我可以在打印时生成最终的 unique-d data.table(例如 print (listelement[[1]]),但当我返回时 (listelement[[1] ]) 我得到 NULL。如果有人能发现我遗漏的东西会有所帮助......或者建议是否有其他更有效的方法来执行此操作。
另外,不必将每个 data.table 添加到列表中,我可以将它们添加为列表中的“引用”吗?我相信像 list(datatable1, datatable2 ...) 这样的事情实际上会复制它们?
## CODE
returnUnique2 <- function (alist) {
if (length(alist) == 1) {
z <- (alist[[1]])
print (class(z))
print (z) ### This is the issue, if I change to return (z), I get NULL (?)
}
if (length(alist) %% 2 == 0) {
alist[[length(alist) - 1]] <- unique(rbind(unique(alist[[length(alist)]]), unique(alist[[length(alist) - 1]])))
alist[[length(alist)]] <- NULL
returnUnique2(alist)
}
if (length(alist) %% 2 == 1 && length(alist) > 2) {
alist[[length(alist) - 1]] <- unique(rbind(unique(alist[[length(alist)]]), unique(alist[[length(alist) - 1]])))
alist[[length(alist)]] <- NULL
returnUnique2(alist)
}
}
## OUTPUT with print statement
t1 <- data.table(col1=rep("a",10), col2=round(runif(10,1,10)))
t2 <- data.table(col1=rep("a",10), col2=round(runif(10,1,10)))
t3 <- data.table(col1=rep("a",10), col2=round(runif(10,1,10)))
tempList <- list(t1, t2, t3)
returnUnique2(tempList)
[1] "list"
[[1]]
col1 col2
1: a 3
2: a 2
3: a 5
4: a 9
5: a 10
6: a 7
7: a 1
8: a 8
9: a 4
10: a 6
更改以下内容,
print (z) ### This is the issue, if I change to return (z), I get NULL (?)
阅读
return(z)
返回 NULL
提前致谢。
【问题讨论】:
-
对于这种大小的数据使用
sqlite怎么样? -
嗨 Karsten,谢谢,我试过了,但还是太慢了……我正在使用 fread 读取 csv 格式的数据,而且似乎比 sqlite 快。另外,以这种方式使用它的动机是我有几个其他数据集,我使用 doParallel/multicore 包将它们卸载到服务器上的各个核心。
-
下面的有用吗?
标签: r data.table