我正在寻找一种方法来使用拆分应用组合策略与R的data.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]
Run Code Online (Sandbox Code Playgroud)
虽然这里非常简单data.table
,但结构更复杂,我希望能够将逻辑提取到函数中并将子集作为data.table
s 发送给它们,而不必征用所有字段名称.
编辑:查看data.table项目维基上可用的更详细的HTML插图.
好的,让我向您展示一个用于显示等效性的plyr
方法的小比较data.table
.也许这对你有所帮助.但是,重要的是你要阅读data.table和这个FAQ的非常好的介绍.
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))
Run Code Online (Sandbox Code Playgroud)
您有一个包含11列,10个数据和1个分组列的data.frame.现在,如果你想在每个组中取每个列的平均值,那么,使用plyr
,你会做类似的事情:
require(plyr)
ddply(df, .(grp), function(x) colMeans(x[, 2:11]))
Run Code Online (Sandbox Code Playgroud)
使用data.table
,您可以使用.SD
(除了阅读文档链接之外,请查看此帖子以获得有关内容的更好解释.SD
).
require(data.table)
dt <-data.table(df, key="grp")
dt[, lapply(.SD, mean), by=grp]
Run Code Online (Sandbox Code Playgroud)
这应该让你开始,我想..?