2013-02-23 64 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