How to apply same function to every specified column in a data.table

后端 未结 7 2222
北海茫月
北海茫月 2020-11-22 08:00

I have a data.table with which I\'d like to perform the same operation on certain columns. The names of these columns are given in a character vector. In this particular ex

相关标签:
7条回答
  • 2020-11-22 08:50

    UPDATE: Following is a neat way to do it without for loop

    dt[,(cols):= - dt[,..cols]]
    

    It is a neat way for easy code readability. But as for performance it stays behind Frank's solution according to below microbenchmark result

    mbm = microbenchmark(
      base = for (col in 1:length(cols)) {
        dt[ , eval(parse(text = paste0(cols[col], ":=-1*", cols[col])))]
      },
      franks_solution1 = dt[ , (cols) := lapply(.SD, "*", -1), .SDcols = cols],
      franks_solution2 =  for (j in cols) set(dt, j = j, value = -dt[[j]]),
      hannes_solution = dt[, c(out_cols) := lapply(.SD, function(x){log(x = x, base = exp(1))}), .SDcols = cols],
      orhans_solution = for (j in cols) dt[,(j):= -1 * dt[,  ..j]],
      orhans_solution2 = dt[,(cols):= - dt[,..cols]],
      times=1000
    )
    mbm
    
    Unit: microseconds
    expr                  min        lq      mean    median       uq       max neval
    base_solution    3874.048 4184.4070 5205.8782 4452.5090 5127.586 69641.789  1000  
    franks_solution1  313.846  349.1285  448.4770  379.8970  447.384  5654.149  1000    
    franks_solution2 1500.306 1667.6910 2041.6134 1774.3580 1961.229  9723.070  1000    
    hannes_solution   326.154  405.5385  561.8263  495.1795  576.000 12432.400  1000
    orhans_solution  3747.690 4008.8175 5029.8333 4299.4840 4933.739 35025.202  1000  
    orhans_solution2  752.000  831.5900 1061.6974  897.6405 1026.872  9913.018  1000
    

    as shown in below chart

    My Previous Answer: The following also works

    for (j in cols)
      dt[,(j):= -1 * dt[,  ..j]]
    
    0 讨论(0)
提交回复
热议问题