【问题标题】:Unused argument未使用的参数
【发布时间】:2020-03-31 18:41:28
【问题描述】:

我想了解.SDcols.SD 的工作原理。我得到了以下函数,可以直接在数据表中应用,但不能通过lapply。我想知道是否有与.SD 等效的方法,它允许将多个参数传递给函数体。下面的代码总是给出“未使用的参数...”

DT <- data.table(a=1:10,b=2:11,c=3:12,ID=c(rep("A",5),rep("B",5)))
doSomething <- function(a,b,c){
tmp <- a/b
tmp2 <- sqrt(tmp)^2000000
tmp3 <- tmp2 + tmp
return(rep(tmp3,length(a)))
}
DT[,doSomething(a,b,c)] # works
DT[,lapply(.SD,doSomething,a,b,c),.SDcol=c("a","b","c")]
DT[,lapply(.SD,doSomething,a=a,b=b,c=c),.SDcol=c("a","b","c")]

【问题讨论】:

  • @akrun 我正在为面板中的每个 ID 应用该函数,因此需要循环

标签: r datatable


【解决方案1】:

如果我们需要使用.SD

out2 <- DT[, do.call(doSomething, .SD), .SDcols = a:c]

也可以写成

DT[, doSomething(.SD[[1]], .SD[[2]], .SD[[3]]), .SDcols = a:c]

-检查

out1 <- DT[,doSomething(a,b,c)] 
identical(out1, out2)
#[1] TRUE

【讨论】:

  • 好的,我明白了,所以 do.call 只是一个接一个地取列。但是什么时候使用 lapply 呢?
  • @User878239 当您执行 lapply 时,它会循环遍历 data.fraame 或 data.table(.SD - dat.atable 的子集),它将是 list 的 @987654328 @ values 然后你在每个向量上应用 doSomething 它需要所有向量/列作为一个集合
  • @User878239 DT[,lapply(.SD,doSomething,a,b,c),.SDcol=c("a","b","c")] 在该向量中不存在“a”、“b”、“c”。您可以通过data(mtcars); lapply(mtcars, function(x) x)查看
  • 谢谢,我知道了
猜你喜欢
  • 2018-01-14
  • 2020-08-18
  • 1970-01-01
  • 1970-01-01
  • 2013-07-07
  • 2012-05-03
  • 2013-04-04
  • 1970-01-01
相关资源
最近更新 更多