可以在管道中使用 data.table 的 rbindlist

Possible to use data.table's rbindlist in a pipe

是否可以在管道操作中使用 data.table rbindlist?我在下面发布了一个 MWE。我尝试通过管道在 rbindlist 中创建 data.table c,但出现错误。

相反,我必须操作 c 然后将 rbindlist 分配给 c(但 c 在 rbindlistlist 参数中使用。如果可能的话,我想避免这种情况,我试图通过上面管道中的 rbindlist 来完成。这可能吗?

感谢任何帮助,谢谢。

library(data.table)
library(magrittr)

a <- data.table(colA = 1:10,
                colB = 11:20)

b <- data.table(colA = 300,
                colB = 500)

c <- a %>% 
  .[, colB := colB * 10] %>% 
  rbindlist(list(.,b),
            use.names = TRUE,
            fill = TRUE)
#> Error in rbindlist(., list(., b), use.names = TRUE, fill = TRUE): idcol must be a logical or character vector of length 1. If logical TRUE the id column will named '.id'.

c <- a %>% 
  .[, colB := colB * 10]

c <- rbindlist(list(c,b),
               use.names = TRUE,
               fill = TRUE)

这确实是可能的,但你想为此使用额外的大括号:

c <- a %>% 
  .[, colB := colB * 10] %>% 
  {rbindlist(list(.,b), use.names = TRUE, fill = TRUE)}

从错误本身来看,原因很明显:

# Error in rbindlist(., list(., b), use.names = TRUE, fill = TRUE): ...

即您的尝试等同于

rbindlist(aTransformed, list(aTransformed, b), use.names = TRUE, fill = TRUE)

这显然不是您的意图,并且不起作用,因为 rbindlist 想要接收要绑定的对象列表作为第一个参数。现在如果我们想使用快捷方式 . 但不想将数据传递给第一个参数,我们可以使用额外的括号 {} 来创建一个表达式。表达式的类型 {x <- 2; y <- x^2; y + x} 返回 y + x,因此 %>% 不将数据作为第一个参数传递是有道理的,因为有 none。

虽然 Julius 的解决方案效果很好,但这个更简单的解决方案是否适合您的目的?

c <- a %>% 
  .[, colB := colB * 10] %>% 
  list(b) %>%
  rbindlist(use.names = TRUE, fill = TRUE)

# without pipes:
c <- 
  rbindlist(
    list(
      a[, colB := colB * 10], 
      b
    ), 
    use.names = TRUE, 
    fill = TRUE
  )