gpt4 book ai didi

r - Data.table 和 get() 命令 (R)

转载 作者:行者123 更新时间:2023-12-01 08:46:20 26 4
gpt4 key购买 nike

我有一个问题,包括 data.table函数中的操作。输入参数是 data.table 名称和列/变量名称。

我可以使用 get() 来引用 data.table命令。但是,对变量名使用相同的命令是行不通的。我知道get()在列/变量名称的情况下可能不合适,但我坚持使用哪个命令。

已编辑:我现在包含了 substitute()而不是 get()它仍然不起作用。

toy_example_fun <- function(d, .expr){

.expr = substitute(.expr)

setkey(get(d), .expr) # ==> doesn't work

d.agg <- get(d)[,list(sum(y), sum(v)), by=.expr] # --> works
}

toy_example_fun("DT", x)

备选方案: quote() --> 这行得通。但是,我对在函数内部运行的解决方案很感兴趣。

DT <- data.table(x=rep(c("a","b","c"),each=3), y=c(1,3,6), v=1:9)    
d <- "DT"
variable <- quote(x)
d.agg <- get(d)[,list(sum(y), sum(v)), by=variable]

尽管如此,后一种选择还是可行的 variable <- quote(x)产生错误信息:

  <simpleError in doTryCatch(return(expr), name, parentenv, handler): object 'x' not found>
<simpleError in is.scalar(val): object 'x' not found>
<simpleError in is.data.frame(obj): object 'x' not found>

感谢您的帮助。

最佳答案

给你:

someFun <- function(d, .expr){
group <- substitute(.expr)
get(d)[,list(sum(y), sum(v)), by=group]
}

someFun("DT", x)
group V1 V2
1: a 10 6
2: b 10 15
3: c 10 24


someFun("DT", "x")
x V1 V2
1: a 10 6
2: b 10 15
3: c 10 24

来自马修的编辑:

+1 以上。和/或字符列名也可以直接被 by 接受:

someFun = function(d, col) {
get(d)[,list(sum(y),sum(v)),by=col]
}
someFun("DT","x")
x V1 V2
1: a 10 6
2: b 10 15
3: c 10 24
someFun("DT","x,y")
x y V1 V2
1: a 1 1 1
2: a 3 3 2
3: a 6 6 3
4: b 1 1 4
5: b 3 3 5
6: b 6 6 6
7: c 1 1 7
8: c 3 3 8
9: c 6 6 9

但是 someFun("DT",x) 将不起作用。所以 Adrie 的回答更笼统。


使用 setkeyv 进行编辑

someFun <- function(d, cols){
setkeyv(get(d), cols)
cols <- substitute(cols)
get(d)[,list(sum(y), sum(v)), by=cols]
}

someFun("DT", "x")
x V1 V2
1: a 10 6
2: b 10 15
3: c 10 24

关于r - Data.table 和 get() 命令 (R),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11859063/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com