[英]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.