根据包含列名的变量从不同列中选择值

use*_*020 9 r data.table

我有一个像这样的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]].我们使用此字符串来选择.SDvia 的相应列.SD[[newname]]..SD代表D ata的S ubset .

备择方案. get(.BY[[1]])应该同样适用于.SD[[.BY[[1]]]].根据@David运行的基准测试,这两种方式同样快.

  • 为了好奇而@Frank我已经在10 ^ 6行上使用`system.time`测试了`get(.BY [[1]])和`.SD [[.BY [[1]]]]`.这两者在时间上难以区分. (2认同)