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

时间:2018-12-18 01:53:03

标签: r data.table magrittr

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

相反,我必须操纵c,然后将rbindlist分配给c(但是c用于list的{​​{1}}参数中。如果可能,我想避免这种情况,我尝试通过上方管道中的rbindlist完成此操作。

感谢您的帮助。

rbindlist

2 个答案:

答案 0 :(得分:3)

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

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,因此,%>%并不希望将数据作为第一个参数传递,因为没有参数。

答案 1 :(得分:3)

虽然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
  )