我有一个这样的数据表:
> 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>
当第一个变量包含在第二个变量中时,我想创建一个为 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
我的问题是访问第二列列表中的元素。我正在尝试类似的东西:
x[, dummy := x[,part] %in% x[, colig]]
或者
x[, dummy := x[,part] %in% unlist(x[, colig])]
这两个选项都是错误的。在第一种情况下,dummy 始终为 FALSE,在第二种情况下,unlist() 命令创建一个列表,其中包含所有列表中的元素(不仅来自相应的行)。
我还尝试了 lapply (比如这里在 R data.table 中创建虚拟变量):
x[, dummy := lapply( x[,part], function(y) y %in% unlist(x[,colig]))]
我认为这是正确的,但我遇到了速度问题,因为我有很多行。
有没有更快的选择?