2013-08-28 22 views
1

我很好奇是否可以將[join函數應用於data.tables列表。 我可以使用函數來處理列表中的每個元素,但是當使用lapply將函數應用於整個列表時,我會收到一個錯誤。將數據表加入運算符應用於數據表列表

### Require data.table 
require(data.table) 

### Create master data.table 
data <- data.table(id = letters[1:10], val = 1:10, key = 'id') 

### Create data tables to be joined 
a <- data.table(id = letters[1:10], height = rnorm(n = 10, mean = 150, sd = 10), key = 'id') 
b <- data.table(id = letters[1:10], weight = rnorm(n = 10, mean = 140, sd = 20), key = 'id') 

### Create a list of data tables to be joined 
l <- list(a, b) 

### Join data tables (Works) 
`[`(l[[1]], data) 
`[`(l[[2]], data) 

### Apply join function to a list. Doesn't work. Why? 
lapply(l, `[`, data) 
Error in `[.default`(x, i) : invalid subscript type 'list' 

此錯誤使我不知道當[被用於R是如何能夠區分加入,與當它被用於提取從物體的元素。例如:

### Extract first column from each data.table in 'l' 
lapply(l, `[`, 1) 

回答

4

?lapply

由於歷史原因,由lapply創建的調用是未計算的,和代碼已經被寫入(例如bquote)依賴於這一點。這意味着記錄的調用始終是FUN(X [[0L]],...)形式,其中0L由當前整數索引替換。這通常不是問題,但如果FUN使用sys.call或match.call,或者它是一個使用該調用的原始函數,則可能是這樣。這意味着用包裝器調用原始函數通常更安全,例如,在R 2.7.1中需要lapply(ll,function(x)is.numeric(x))以確保is.numeric的方法分派正確發生。

您需要的功能包[,即:

lapply(l, function(d) `[`(d, data))