例如,我有两个小标题
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 行。
目前,我坚持使用以下代码:
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")
我仍然不知道这会有多快,所以也许你可以让它更快。