首页 > 解决方案 > 将R中不同级别的列表相乘

问题描述

我想将列表中两个级别的数值乘以 R 中另一个列表中另一个级别的值。例如,考虑以下内容:

library(tidyverse)
library(purrr)
library(dplyr)

weights <- list(a = list(1, 3, 8), b = list(2, 4), c = list(5, 2, 8, 0.5)) 
multiplier <- list(0.5, 0.25, 0.10)

这是我想做的基本想法,但这不起作用.....

result <- weights * multiplier

我想生成一个列表,其结构与标题为“权重”的列表相同,但每个变量都乘以“乘数”列表中的值。

我想要的结果是:

result <- list(a = list(0.5, 1.5, 4), b = list(0.5, 1), c = list(0.5, 0.2, 0.8, 0.05))

我觉得这应该是一件相对容易的事情,但我似乎无法弄清楚。

标签: rlist

解决方案


我们可以使用map2循环遍历list,并且由于“权重”是一个嵌套列表,unlist它与“乘数”列表中的每个对应元素相乘,然后relist返回list

library(purrr)
map2(weights, multiplier,  ~ relist(unlist(.x) * .y, skeleton = .x))

中的类似选项base RMap

Map(function(x, y) relist(unlist(x) * y, skeleton = x), weights, multiplier)

或者另一种选择是将stack其添加到两列data.frame,然后在replicating后进行乘法以使长度相同,然后relist

relist(with(stack(weights), values *
          rep(unlist(multiplier), table(ind))), weights)

推荐阅读