假设我从
开始mtcarsDT<-data.table(mtcars)
我想要等同于
mtcarsDT[,.(mpg, cyl, disp, hp, drat, wt, qsec, vs, am, gear, carb, newcol=myFunc())]
但是我只想输入类似mtcarsDT[,.(.SD, newcol=myFunc())
之类的简短内容,但是语法当然不起作用。
答案 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()
。