2013-02-23 52 views
3

我正在寻找一种方式来使用分割申请,结合有R的data.table包策略。“* R中的数据表层”功能

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.table s到他们,而不必争取所有字段名

+0

@阿伦,我已经编辑了一下这个问题,但我没有意识到'.SD'会在一瞬间。 – nikola 2013-02-23 21:43:12

回答

9

编辑:退房的project wiki of data.table提供更详细的HTML护身符

好的,让我来向你展示一个使用data.tableplyr方法的小比较来展示等价性。也许这会帮助你开始。但重要的是您阅读this very nice introduction to data.tablethis 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)) 

你有一个data.frame有11列,10个数据和1个分组列。现在,如果你想利用这些列的平均每个组内,然后使用plyr,你会做这样的事情:使用data.table

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

,您可以使用.SD(检查this post为关于.SD的一个很好的解释,除了阅读文档链接外)。

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

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

+2

嘿 - 这很好,非常感谢!基本上我一直在寻找的是'.SD'功能。 – nikola 2013-02-23 21:55:04