使用purrr :: map将新列分配给data.tables列表

时间:2018-04-18 09:27:15

标签: r purrr

我正在尝试向驻留在列表中的所有data.tables添加新列。列表中的所有data.tables都具有相同的结构。

代表: 我们来看一个2个数据表的简单列表ldt

library(data.table)
dt1 <- data.table(x=1:3,y=(1:3)^2)
dt2 <- data.table(x=5:7,y=(1:3)^2)
ldt <- list(d1=dt1,d2=dt2)

现在假设我想在两个数据表中添加一个新列z,其值存储在一个字符向量中:

new_col <- c("DOC1","DOC2")

所以我想将DOC1附加到dt1$zDOC2附加到dt2$z

我尝试了purrr::map

的以下语法
purrr::map2(.x = ldt,.y = doc,.f = ~ ldt$z = doc)

但它会出现以下错误:

  

错误:“map2中的意外'='(。x = ldt,.y = doc,.f = ~ldt $ z =”

我试过了:

 map2(.x = ldt,.y = doc,.f = function(x,y) x$z <- y)

但是这会产生一个列表输出:

$d1
[1] "DOC1"

$d2
[1] "DOC2"

我做错了什么?

另外,如果有人可以请我指导一个purrr教程,该教程会采用一些不同的例子而不是这里的直接示例,那就太棒了。

https://stackoverflow.com/a/48144294/1972786 https://purrr.tidyverse.org/reference/map2.html#arguments

1 个答案:

答案 0 :(得分:2)

你需要使用有点解除。 (对不起,我根本不熟悉data.table,但在整洁的评估中,这个术语听起来像这样)。 但这就是你如何解决它:

我们有什么......

library(data.table)
library(tidyverse)

dt1 <- data.table(x=1:3,y=1:3^2)
dt2 <- data.table(x=5:7,y=1:3^2)
ldt <- list(d1=dt1,d2=dt2)

new_col <- c("DOC1","DOC2")

现在,您遍历data.tables(.x)列表和新变量z.y)的值。 data.table[]内使用非标准评估,因此要创建以字符向量"z"命名的新变量,您必须使用:=。见代码:

map2(ldt, new_col, ~ .x[, "z" := .y])
#> $d1
#>    x y    z
#> 1: 1 1 DOC1
#> 2: 2 2 DOC1
#> 3: 3 3 DOC1
#> 4: 1 4 DOC1
#> 5: 2 5 DOC1
#> 6: 3 6 DOC1
#> 7: 1 7 DOC1
#> 8: 2 8 DOC1
#> 9: 3 9 DOC1
#> 
#> $d2
#>    x y    z
#> 1: 5 1 DOC2
#> 2: 6 2 DOC2
#> 3: 7 3 DOC2
#> 4: 5 4 DOC2
#> 5: 6 5 DOC2
#> 6: 7 6 DOC2
#> 7: 5 7 DOC2
#> 8: 6 8 DOC2
#> 9: 7 9 DOC2