在data.tables R中应用基于列名称的函数 [英] Apply a function based on column name in data.tables R

查看:76
本文介绍了在data.tables R中应用基于列名称的函数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在寻找根据给定列的名称应用用户定义函数

I'm looking to apply a user define function based on the name given to a column

dt <- data.table(gr_id = 1, id = seq(1,10),min_c = runif(10,10,30),
                 ml_c = runif(10,30,50),mx_c = runif(10,50,100),
                 min_t = runif(10,10,20),ml_t = runif(10,20,25),
                 mx_t = runif(10,25,30))

我想应用一个计算(min(min)+ min(ml))/ mx 用于c列和t列。目前,我做了如下。但是,当我想添加更多列(让我们说a)时变得很难。

I would like to apply a function which calculates (min(min)+min(ml))/mx for both "c" columns and "t" columns. Currently, I've done as follows. However, becomes hard when I want to add more columns (lets say, "a")

dt[,{
  temp1 = min(min_c)
  temp2 = min(ml_c)
  temp3 = min(mx_c)
  score_c = (temp1+temp2)/temp3
  temp4 = min(min_t)
  temp5 = min(ml_t)
  temp6 = min(mx_t)
  score_t = (temp4+temp5)/temp6
  list(score_c = score_c,
       score_t = score_t)
},by = gr_id
  ]


推荐答案

我认为这将工作。基本思想是使用 get

I think this will work. the basic idea is using get.

# the original code could be simplified to:
dt[, .(
    score_c = (min(min_c) + min(ml_c)) / min(mx_c),
    score_t = (min(min_t) + min(ml_t)) / min(mx_t)
    ), by = gr_id]
# 
#    gr_id   score_c score_t
# 1:     1 0.9051556 1.28054

# using `get`
cols <- c('c', 't')
dt[, {
    res <- lapply(cols, function(i){
        vars <- paste(c('min', 'ml', 'mx'), i, sep = '_')
        (min(get(vars[1])) + min(get(vars[2]))) / min(get(vars[3]))
    })
    names(res) <- paste('score', cols, sep = '_')
    res
}, by = gr_id]

#    gr_id   score_c score_t
# 1:     1 0.9051556 1.28054

这篇关于在data.tables R中应用基于列名称的函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆