我正在研究一个函数,该函数将具有相同列名的数据表列表作为输入并返回一个数据表,该数据表具有使用连续 rbind 组合的每个数据帧的唯一行,如下所示。
该函数将应用于“非常”大的 data.table(数百万行),这就是为什么我必须将其拆分为几个较小的数据表并将它们分配到一个列表中以使用递归的原因。在每一步,根据数据表列表的长度(奇数或偶数),我在该列表索引处找到 data.table 的唯一性,在列表索引 x - 1 处找到数据表,然后连续 rbind 2 并分配列出索引 x - 1,以及更多列出索引 x。
我一定遗漏了一些明显的东西,因为虽然我可以在打印时生成最终的 unique-d data.table(例如 print (listelement[[1]]),但当我返回 (listelement[[1]]) 时,我get 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
提前致谢。