我正在尝试向驻留在列表中的所有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$z
和DOC2
附加到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
答案 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