簡體   English   中英

如何將用戶定義函數的參數傳遞為data.table中的列名?

[英]how to pass the argument of a user-defined function to be a column name in data.table?

如何在函數旁邊將參數傳遞為data.table的列名? 例如,我有一個名為data1的數據,其列名為“小時”和“位置”。 在輸出中,我想按位置查找離群值,並以“小時數”命名。 我試過使用replace(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)

最好編寫使用字符值來選擇列的函數。 在這種情況下,您的函數可以重寫為:

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

通過使用[boxplot.stats的輸出進行子集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軟件包使用它來允許數據庫內處理。 如果沒有好處(除了不必鍵入一些引號),那就只有成本了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM