矢量化总和,权重从另一个小标题中提取

问题描述 投票:0回答:1

例如,我有两个小标题

library(tidyverse)

A <- tibble(
  G = c("A","A","B"),
  a = c("a", "b","c"),
  e = c(1, 2, 3))

Z <- tibble(
  i = c("a", "a", "a", "b", "b", "b", "c", "c", "c"),
  j = c("a", "b", "c", "a", "b", "c", "a", "b", "c"),
  z = c(1, .5, 0, 0, 1, 0, 0, 0, 1))

我想按如下方式改变

A$e
的值:

我希望

e
现在是所有列
e
的向量化总和,当
Z$z
a == i
时,按
a == j
的值加权,按
G
分组。

例如,对于

A
组:

z_sum_e <- c( 1*1 + 2*.5, 1*0 + 2*1) 

我认为有很多方法可以做到这一点,并且使用像

weighted.sum
这样的预打包函数可以使编码变得更容易,因为它会降低任务的复杂性,只需要过滤并从中提取正确的
nrow(A)
权重
Z$z
,然后
map
e
的变异,考虑到列
e
始终相同,唯一改变的是权重向量。

例如,

A %>%
  mutate(w = map(a,
                 ~ Z$z[Z$i == .x & Z$j %in% a]),
         .by = "G")

使用此代码,我必须始终对按

e
分组的同一列
G
求和,矢量化将基于采用的权重
w

我想要一个快速的解决方案,因为数据集大约有 50 万行,已分组,每组大约 5 行。

dplyr tibble weighted
1个回答
0
投票

目前,我坚持使用以下代码:

A %>%
  mutate(w = map(a,
                 ~ Z$z[Z$i == .x & Z$j %in% a]),
         .by = "G") %>%
  mutate(e = map_dbl(w, ~ sum(.x * e)),
         .by = "G")

我仍然不知道这会有多快,所以也许你可以让它更快。

© www.soinside.com 2019 - 2024. All rights reserved.