次のようなデータテーブルがあります。
> x
part colig
1: PR PT, PMDB
2: PMDB PT, PMDB
3: PMDB PT, PMDB
4: PDT PT, PMDB
5: PMDB PT, PMDB
6: PFL PSDB,PFL,PTB
7: PPB PSDB,PFL,PTB
8: PMDB PSDB,PFL,PTB
9: PMDB PSDB,PFL,PTB
10: PPB PSDB,PFL,PTB
> str(x)
Classes ‘data.table’ and 'data.frame': 10 obs. of 2 variables:
$ part : chr "PR" "PMDB" "PMDB" "PDT" ...
$ colig:List of 10
..$ : chr "PT" "PMDB"
..$ : chr "PT" "PMDB"
..$ : chr "PT" "PMDB"
..$ : chr "PT" "PMDB"
..$ : chr "PT" "PMDB"
..$ : chr "PSDB" "PFL" "PTB"
..$ : chr "PSDB" "PFL" "PTB"
..$ : chr "PSDB" "PFL" "PTB"
..$ : chr "PSDB" "PFL" "PTB"
..$ : chr "PSDB" "PFL" "PTB"
- attr(*, ".internal.selfref")=<externalptr>
最初の変数が 2 番目の変数に含まれているときに 1 になるダミー変数を作成したいと考えています。私の望ましい出力は次のとおりです。
> x
part colig dummy
1: PR PT, PMDB FALSE
2: PMDB PT, PMDB TRUE
3: PMDB PT, PMDB TRUE
4: PDT PT, PMDB FALSE
5: PMDB PT, PMDB TRUE
6: PFL PSDB,PFL,PTB TRUE
7: PPB PSDB,PFL,PTB FALSE
8: PMDB PSDB,PFL,PTB FALSE
9: PMDB PSDB,PFL,PTB FALSE
10: PPB PSDB,PFL,PTB FALSE
私の問題は、2 列目のリスト内の要素にアクセスすることです。私は次のようなことを試みています:
x[, dummy := x[,part] %in% x[, colig]]
また
x[, dummy := x[,part] %in% unlist(x[, colig])]
2 つのオプションは間違っています。最初のケースでは、ダミーは常に FALSE であり、2 番目のケースでは、unlist() コマンドは、(それぞれの行だけでなく) すべてのリストからの要素を含むリストを作成します。
私もlapplyで試しました(ここのようにR data.tableでダミー変数を作成しています):
x[, dummy := lapply( x[,part], function(y) y %in% unlist(x[,colig]))]
これは正しいと思いますが、行が多いため速度に問題があります。
より速いオプションはありますか?