1

我很好奇是否可以将[orjoin函数应用于 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

1 回答 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))
于 2013-08-28T18:21:33.987 回答