3

我正在寻找一种将 split-apply-combine 策略与 Rdata.table包一起使用的方法。

library(data.table)

# take a data.table object, return integer
func <- function(DT) 
{
   DT$a * DT$a
}

DT = data.table(
  a = 1:50
  # ... further fields here
  b = rep(1:10, 5)
)

# this obviously won't work:
DT[, result:=func, by=b]

# but this will (based on @Aruns answer below)
DT[, result:=func(.SD), by=b]

虽然这里非常简单data.table,结构更复杂,但我希望能够将逻辑提取到函数中并将子集作为data.tables 发送给它们,而不必列出所有字段名称。

4

1 回答 1

9

编辑:查看data.table 项目 wiki 上提供的更详细的 HTML 小插图。

好的,让我向您展示一个用于显示等效性的plyr方法的小比较。data.table也许这会帮助你开始。但重要的是您阅读这个非常好的 data.table 介绍这个常见问题解答

set.seed(45) # for reproducibility
# dummy data
m  <- matrix(10*sample(15, 100, replace=T), ncol=10) # 100*10 matrix
df <- data.frame(grp = sample(1:10, 100, replace = T))
df <- cbind(df, as.data.frame(m))

您有一个包含 11 列、10 个数据和 1 个分组列的 data.frame。现在,如果您想获取每个组中每个列的平均值,那么使用plyr,您可以执行以下操作:

require(plyr)
ddply(df, .(grp), function(x) colMeans(x[, 2:11]))

使用data.table,您可以使用(除了阅读文档链接之外,.SD请查看这篇文章以获得关于什么的很好的解释)。.SD

require(data.table)
dt <-data.table(df, key="grp")
dt[, lapply(.SD, mean), by=grp]

这应该让你开始,我想..?

于 2013-02-23T21:52:19.053 回答