2017-11-28 4 views
0

複数のデータテーブルを一意のIDに対応するレコードにサブセット化する必要があります。類似のスレッドはherehereです。これらのソリューションは、私が別々に各データテーブルをプログラムすると機能しますが、私が持っているすべてのデータテーブルでコードを実行したいと思います。複数のデータテーブルの行を削除して元のデータテーブルに保存

私のデータは、このようなものになります。

dt1 <- data.table(var1 = c("A", "B", "C"), var2 = c("...", "...", "..."), id = c("101", "105", "105")) 
dt2 <- data.table(var1 = c("D", "E", "F"), var2 = c("...", "...", "..."), var3 = c("...", "...", "..."), id = c("110", "110", "139")) 
dt3 <- data.table(var1 = c("B", "G", "H"), id = c("105", "113", "113")) 

> dt1 
    var1 var2 id 
1: A ... 101 
2: B ... 105 
3: C ... 105 
> dt2 
    var1 var2 var3 id 
1: D ... ... 110 
2: E ... ... 110 
3: F ... ... 139 
> dt3 
    var1 id 
1: B 105 
2: G 113 
3: H 113 

を各データテーブルは、最終的にこのになるように、私はすべての重複のIDを削除したいと思います:

> dt1 
    var1 var2 id 
1: A ... 101 
> dt2 
    var1 var2 var3 id 
3: F ... ... 139 
> dt3 
    var1 id 
1: B 105 

私は成功した各データをサブセットすることができますテーブルを個別にdt1 <- dt1[, if(.N==1) .SD, by = id]などを使用して、代わりに私は一度に各テーブルを更新したいと思います。

私はlapply(list(dt1, dt2, dt3), function(x) x[, if(.N==1) .SD, by = id])を試しましたが、これは私の環境で私のテーブルを更新しません。たとえば、sub <- lapply(list(dt1, dt2, dt3), function(x) x[, if(.N==1) .SD, by = id])を使用して結果をリストに保存すると、データテーブルをdt1 <- as.data.table(sub[1])などとして保存できますが、避けようとしている各データテーブルを手動でコーディングすることに戻ります。私はをちょうど私のコンソールにlist()を返して試してみましたが、私が知る限り何も更新していませんでした。 hereとしてlist2env(sub, envir=.GlobalEnv)を使用すると、「names(x)はxと同じ長さの文字ベクトルでなければなりません」というエラーが発生しました。

元のデータテーブル内の重複したIDレコードを同時に削除する方法に関する提案はありますか?

答えて

1

あなたの問題を解決しますが、これは最善の方法ではないかもしれません。場合によっては、forループを回避することはできません。

y=c("dt1","dt2","dt3") 
for(i in 1:3){ 
    assign(y[i],(get(y[i])[, if(.N==1) .SD, by = id])) 
} 

今すぐ試してみて、DT1を呼び出し、ここで残り

1

duplicatedを持つ別のオプションです。 mgetを使用してlistのオブジェクトの値を取得し、次にduplicatedを使用して 'idが重複している行を削除します。 listに保存することをお勧めしますが、必要に応じてグローバル環境のオブジェクトを更新します。list2env

list2env(lapply(mget(paste0("dt", 1:3)), 
    function(x) x[!(duplicated(id)|duplicated(id, fromLast=TRUE))]), .GlobalEnv) 
dt1 
# var1 var2 id 
#1: A ... 101 

dt2 
# var1 var2 var3 id 
#1: F ... ... 139 

dt3 
# var1 id 
#1: B 105 
関連する問題