可以在管道中使用 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 在 rbindlist
的 list
参数中使用。如果可能的话,我想避免这种情况,我试图通过上面管道中的 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
)
是否可以在管道操作中使用 data.table
rbindlist
?我在下面发布了一个 MWE。我尝试通过管道在 rbindlist
中创建 data.table
c,但出现错误。
相反,我必须操作 c 然后将 rbindlist
分配给 c(但 c 在 rbindlist
的 list
参数中使用。如果可能的话,我想避免这种情况,我试图通过上面管道中的 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
)