R数据表中的"*ply"功能

nik*_*ola 3 r data.table

我正在寻找一种方法来使用拆分应用组合策略与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.tables 发送给它们,而不必征用所有字段名称.

Aru*_*run 9

编辑:查看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)

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

  • 嘿 - 非常好,非常感谢!基本上我所寻找的是`.SD`功能. (2认同)