如何选择所有列以及其他表达式

时间:2019-07-25 18:58:31

标签: r data.table

假设我从

开始
mtcarsDT<-data.table(mtcars)

我想要等同于

mtcarsDT[,.(mpg, cyl,  disp,  hp, drat,    wt,  qsec, vs, am, gear, carb, newcol=myFunc())]

但是我只想输入类似mtcarsDT[,.(.SD, newcol=myFunc())之类的简短内容,但是语法当然不起作用。

2 个答案:

答案 0 :(得分:4)

我通常的方式是

c(.SD, .(newcol = f())

在将函数应用于多个列(例如

)时,此方法也很有用
c(
  g = lapply(.SD, g),
  f = lapply(.SD, f),
  .(N = .N)
)

此语法之所以有效,是因为

  • 返回值应该是(列的)列表;
  • .SD已经是一个列表;
  • c()可用于合并列表;和
  • .()list()内部为方便起见而提供的DT[...]的别名。

详细信息。来自?data.table

  

只要j返回一个list,列表的每个元素就会成为结果data.table中的一列。这是默认的增强模式。

类似的行在第一个插图vignette("datatable-intro")中出现了两次,但不幸的是,没有像OP这样的示例。 (也许应该添加一个?)

  

我真的不想创建一列,我只想查看现有列旁边的表达式结果,而不必保存该列然后在以后将其删除

对于此用例,最佳解决方案可能是进行浅表复制。该功能为not available yet

答案 1 :(得分:1)

您可以使用cbind。例如:

cbind(mtcarsDT, newcol = sqrt(mtcarsDT$mpg))

当然,您可以定义新列并选择新数据表:

mtcarsDT[, newcol := sqrt(mpg)]
mtcarsDT

在这两个示例中,为简单起见,我假设您的函数为sqrt()