【问题标题】:Data.table and get() command (R)Data.table 和 get() 命令 (R)
【发布时间】:2012-08-08 06:46:57
【问题描述】:

我在函数中包含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 &lt;- 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> 

感谢您的帮助。

【问题讨论】:

  • 感谢您将我推荐给您的帖子,Andrie。但是,如果我使用substitute(),它仍然无法正常工作。
  • 请通过在链接问题的答案中合并建议来编辑您的问题 - 否则您可能会因为重复而被关闭。
  • 完成。再次感谢您的评论。
  • 这仍然是重复的。您应该按照链接答案中的说明使用quote(x)

标签: r function data.table


【解决方案1】:

给你:

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

【讨论】:

  • 谢谢,安德烈和马修。你的回答对我帮助很大。然而,在我的最后一个函数中,我还需要使用setkey() 命令。虽然另一部分有效,但setkey(get(d), .expr) 行仍然无效。实际上,这就是我感到困惑的原因(我从来没有看过聚合,因为我首先从setkey() 得到了错误。)
  • @majom 改用?setkeyv(末尾加v)。
  • 太完美了。非常感谢!非常感谢您的帮助。
  • 完成。感谢您的提示,并感谢您开发了如此出色的软件包!
猜你喜欢
  • 2018-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-31
相关资源
最近更新 更多