入力と同じ列名を持つデータ テーブルのリストを取得し、以下に示すように、連続した rbind を使用して結合された各データ フレームからの一意の行を持つ単一のデータ テーブルを返す関数に取り組んでいます。
関数は「非常に」大きなdata.table(数千万行)に適用されるため、それをいくつかの小さなデータテーブルに分割し、それらをリストに割り当てて再帰を使用する必要がありました。データ テーブルのリストの長さ (奇数または偶数) に応じて各ステップで、そのリスト インデックスで data.table の一意を見つけ、リスト インデックス x - 1 でデータ テーブルを見つけ、次に 2 を連続して rbind して割り当てます。インデックス 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 を返します
前もって感謝します。