簡體   English   中英

將data.table的列名保留在用戶定義的函數中

[英]Keep the column names of a data.table in a user-defined function

假設我有以下data.table對象

library(data.table)
dt <- data.table(
  x = c(1, 2, 3, 4, 5),
  y = c(1, 1, 3, 4, 5),
  z = c(1, 1, 1, 4, 5)
)

我希望能夠計算任何統計信息的唯一值的數量,將其提高到y並返回到data.table ,並保留統計信息的名稱。

我想做以下事情

foo <- function(stats, y){
  lapply(stats, function(stat){length(unique(stat))^y})
}

dt[, foo(.(x, y), 2)]
##     V1 V2
##  1: 25 16

但我希望輸出是

dt[, foo(.(x, y), 2)]
##      x  y
##  1: 25 16

請注意,這樣做

dt[, foo(.(x=x, y=y), 2)]
##      x  y
##  1: 25 16

或這個

dt[, foo(data.table(x, y), 2)]
##      x  y
##  1: 25 16

可以使用,但是我認為我之前建議的語法看起來更好。 是否可以對foo函數進行調整,或者我必須以某種方式直接對data.table包中的.(函數進行調整?

這是兩個潛在的解決方法。 第一個是您要的:

foo <- function(stat, x){
  DF <- lapply(stat, function(stat2){length(unique(stat2))^x})
  names(DF) <- sapply(substitute(stat)[-1], deparse)
  return(DF)
}

dt[, foo(.(x, y), 2)]
    x  y
1: 25 16

我認為這可能與用戶友好程度相同,並且功能可能更強大。 如果您詢問data.table ,則應嘗試利用其優勢。

foo2 <- function(DT, exponent, SD_cols , by_v = NULL){

  DT[,
     lapply(.SD, function(stat) {length(unique(stat))^exponent}),
     .SDcols = SD_cols,
     by = by_v]
}

foo2(dt, 2, c('x','y'), by_v = 'z')
   z x y
1: 1 9 4
2: 4 1 1
3: 5 1 1

foo2(dt, 2, c('x', 'y'))
    x  y
1: 25 16

暫無
暫無

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

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