我有一个像这样的data.table:
col1 col2 col3 new
1 4 55 col1
2 3 44 col2
3 34 35 col2
4 44 87 col3
Run Code Online (Sandbox Code Playgroud)
我想填充另一列matched_value
,其中包含列中给出的相应列名称中的值new
:
col1 col2 col3 new matched_value
1 4 55 col1 1
2 3 44 col2 3
3 34 35 col2 34
4 44 87 col3 87
Run Code Online (Sandbox Code Playgroud)
例如,在第一行中,值为new
"col1",因此matched_value
取值col1
为1,即1.
如何在一个非常大的data.table上有效地在R中做到这一点?
Fra*_*ank 11
使用晦涩的借口.BY
:
DT[, newval := .SD[[.BY[[1]]]], by=new]
col1 col2 col3 new newval
1: 1 4 55 col1 1
2: 2 3 44 col2 3
3: 3 34 35 col2 34
4: 4 44 87 col3 87
Run Code Online (Sandbox Code Playgroud)
这个怎么运作.这会根据字符串将数据拆分为组new
.每个组的字符串值存储在newname = .BY[[1]]
.我们使用此字符串来选择.SD
via 的相应列.SD[[newname]]
..SD
代表D ata的S ubset .
备择方案. get(.BY[[1]])
应该同样适用于.SD[[.BY[[1]]]]
.根据@David运行的基准测试,这两种方式同样快.