如何将用户定义函数的参数传递给data.table中的列名?

时间:2017-08-11 16:35:28

标签: r function data.table

如何在函数旁边传递一个参数作为data.table的列名? 例如,我有一个名为data1的数据,其中包含名为' hours'和' location'。在输出中,我想按位置查找异常值,并以“小时”命名。我尝试使用替代(y)等等,输出总是使用' y'作为列名。谁能帮助我?谢谢。

mf<-function(data, y){
newy<-as.name(deparse(substitute(y)))
output<-data[,.(y=boxplot.stats(eval(newy))$out),by=.(location)]
return(output)
}
mf(data=data1,y=hours)

1 个答案:

答案 0 :(得分:0)

编写用于选择列的字符值的函数会更好。在这种情况下,您的功能可以重写为:

mf <- function(data, y){
  output <- data[, boxplot.stats(get(y))['out'], by = .(location)]
  setnames(output, 'out', y)
  return(output)
}

通过使用[boxplot.stats的输出进行子集化,返回包含一个元素('out')的命名列表。因此output将有两列:locationout。然后,您只需将out更改为y的任何内容。

示例:

set.seed(100)
data1 <- data.table(
  location = state.name,
  hours    = rpois(1000, 12)
)
mf(data = data1, y = 'hours')
#           location hours
#  1:       Delaware    25
#  2:        Georgia    21
#  3:          Idaho     4
#  4:  Massachusetts     5
#  5:       Missouri     7
#  6: South Carolina     5
#  7: South Carolina     6
#  8:   South Dakota    20
#  9:          Texas     5
# 10:           Utah    22

非标准评估很棘手,只有你能从中得到一些东西才值得努力。 data.table在幕后使用它进行优化。 tidyverse包使用它来允许数据库内处理。如果没有任何好处(除了不必输入几个引号),只需付费。