使用R中的map()将列表元素中的一列乘以一个向量,即可创建新列



我有一个多个元素的列表(13个元素,每个元素的维度不同,但列名相同),例如:

tbl1 <- tibble(Code = c(1,2,3,4),
Column1 = c(10,11,12,13),
Column2 = c(14,15,16,17))
tbl2 <- tibble(Code = c(5,6,7,8),
Column1 = c(14,15,16,17),
Column2 = c(18,19,20,21))

my_list <- list(Element1 = tbl1, Element2 = tbl2)
vector <- c(0.5, 0.6, 0.7, 0.8)

我想将每个列表元素的Column2乘以每个向量元素,并将结果列绑定到数据帧,如下所示:

my_list %>%
map(.f = function(x) x %>% 
mutate(!!paste0("Column_", vector[1]) := pmap_dbl(list(Column2, vector[1]), prod),
!!paste0("Column_", vector[2]) := pmap_dbl(list(Column2, vector[2]), prod),
!!paste0("Column_", vector[3]) := pmap_dbl(list(Column2, vector[3]), prod),
!!paste0("Column_", vector[4]) := pmap_dbl(list(Column2, vector[4]), prod)))
$Element1
# A tibble: 4 x 7
Code Column1 Column2 Column_0.5 Column_0.6 Column_0.7 Column_0.8
<dbl>   <dbl>   <dbl>      <dbl>      <dbl>      <dbl>      <dbl>
1     1      10      14        7          8.4        9.8       11.2
2     2      11      15        7.5        9         10.5       12  
3     3      12      16        8          9.6       11.2       12.8
4     4      13      17        8.5       10.2       11.9       13.6
$Element2
# A tibble: 4 x 7
Code Column1 Column2 Column_0.5 Column_0.6 Column_0.7 Column_0.8
<dbl>   <dbl>   <dbl>      <dbl>      <dbl>      <dbl>      <dbl>
1     5      14      18        9         10.8       12.6       14.4
2     6      15      19        9.5       11.4       13.3       15.2
3     7      16      20       10         12         14         16  
4     8      17      21       10.5       12.6       14.7       16.8

但我不知道如何在向量中迭代。。。如何将mutate(!!paste0("Column_", vector[x]) := pmap_dbl(list(Column2, vector[x]), prod)更改为map(),使其尽可能通用,并可用于任何长度的向量?

期待你的想法!

谢谢

这里有一个策略。基本上,您使用map_dfc将向量转换为一组列。

map(my_list, function(x) {
bind_cols(x, map_dfc(set_names(vector, paste0("Column_", vector)), ~x$Column2*.x))
})

由于我们有一个嵌套映射,我为接收每个数据帧的外部函数使用了一个显式函数。这将有助于区分x(数据帧)和.x(向量值)。我们使用set_names,因此map_dfc将使用这些名称作为它创建的新列的名称。实际的乘法不需要映射,因为乘法在R.中是矢量化的

基本R尝试-

cols <- paste0('Column_', vector)
lapply(my_list, function(x) {
x[cols] <- lapply(vector, `*`, x$Column2)
x
})
#$Element1
# A tibble: 4 x 7
#   Code Column1 Column2 Column_0.5 Column_0.6 Column_0.7 Column_0.8
#  <dbl>   <dbl>   <dbl>      <dbl>      <dbl>      <dbl>      <dbl>
#1     1      10      14        7          8.4        9.8       11.2
#2     2      11      15        7.5        9         10.5       12  
#3     3      12      16        8          9.6       11.2       12.8
#4     4      13      17        8.5       10.2       11.9       13.6
#$Element2
# A tibble: 4 x 7
#   Code Column1 Column2 Column_0.5 Column_0.6 Column_0.7 Column_0.8
#  <dbl>   <dbl>   <dbl>      <dbl>      <dbl>      <dbl>      <dbl>
#1     5      14      18        9         10.8       12.6       14.4
#2     6      15      19        9.5       11.4       13.3       15.2
#3     7      16      20       10         12         14         16  
#4     8      17      21       10.5       12.6       14.7       16.8

相关内容

  • 没有找到相关文章

最新更新