Можно использовать rbindlist из data.table в конвейере - PullRequest
0 голосов
/ 18 декабря 2018

Можно ли использовать data.table rbindlist в трубопроводной операции?Я разместил MWE ниже.Я пытаюсь создать data.table c, отправляя по трубопроводу в rbindlist, но получаю ошибку.

Вместо этого мне приходится манипулировать c, а затем назначить rbindlist для c (но c используется внутриАргумент list в rbindlist. Если возможно, я бы хотел избежать этого, чего я пытался достичь с помощью 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)

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Хотя решение 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
  )
0 голосов
/ 18 декабря 2018

Это действительно возможно, но вы хотите использовать для этого дополнительные скобки:

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, поэтому имеет смысл, что %>% не позволяет передавать данные в качестве первого аргумента, поскольку их нет.

...