【问题标题】:Applying the Data Table Join Operator to a List of Data Tables将数据表连接运算符应用于数据表列表
【发布时间】:2013-08-28 18:14:15
【问题描述】:

我很好奇是否可以将[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)

【问题讨论】:

    标签: r join data.table


    【解决方案1】:

    ?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))
    

    【讨论】:

      猜你喜欢
      • 2010-11-01
      • 1970-01-01
      • 2014-10-08
      • 2016-12-09
      • 2014-09-25
      • 2015-11-01
      • 1970-01-01
      • 2011-12-31
      • 2021-03-20
      相关资源
      最近更新 更多