【问题标题】:Weighted mean of a group, where weight is from another group一组加权平均值,其中权重来自另一组
【发布时间】:2020-11-03 14:48:08
【问题描述】:

假设您有一个如下形式的长 data.frame:

ID Group Year Field VALUE
1  1     2016 AA    10
2  1     2016 AA    16
1  1     2016 TOTAL 100
2  1     2016 TOTAL 120
etc..

并且您希望使用Field == TOTAL 作为 >2013 年的权重,为每个 group_by(Group, Year, Field) 创建一个 weighted.mean(Value,??) 的分组输出。

到目前为止,我正在使用 dplyr:

dat %>% 
filter(Year>2013) %>% 
group_by(Group, Year, Field) %>% 
summarize(m = weighted.mean(VALUE,VALUE[Field == 'TOTAL'])) %>%
ungroup() 

现在的问题(据我了解)是,使用 group_by 之后我无法定义“字段”值,因为我告诉它查看“字段 == AA”组。

将数据从长转换为宽不是解决方案,因为我有超过 1000 个不同的字段值,这些值可能会随着时间的推移而增加,并且此代码将在某个时候每天运行。

【问题讨论】:

  • 为什么不用VALUE 的值在Field == TOTAL 处添加另一行?然后在您对weighted.mean() 的调用中引用此内容。
  • 好主意。您将如何在所有“字段”值中复制该值,以确保它们在每个“年”中正确复制?
  • 我现在正在研究这种方法。作为替代方案,是否可以使用VALUE 的最大值而不是Field == TOTAL 的位置?假设总值将始终是每个年份和字段中最大的 VALUE
  • 不幸的是,它出现在财务报告中。因此,要达到变量 TOTAL 减法会发生 - 所以我不能 100% 认为 TOTAL 是最大值。

标签: r dplyr


【解决方案1】:

首先,这是一个 hacky 解决方案,我确信有更好的方法来解决这个问题。目标是创建一个包含权重的新列,这种方法使用left_join() 的填充特性来实现,但我相信您可以使用fill()across() 来做到这一点。

library(tidyverse)
#> Warning: package 'tidyverse' was built under R version 4.0.3
# Example data from OP
dat <- data.frame(ID = c(1,2,1,2), Group = rep(1,4), Year = rep(2016,4),Field = c("AA","AA","TOTAL","TOTAL"), VALUE = c(10,16,100,120))

# Make a new dataframe containing the TOTAL values
weights <- dat %>% filter(Field == "TOTAL") %>% mutate(w = VALUE) %>% select(-Field,-VALUE)
weights
#>   ID Group Year   w
#> 1  1     1 2016 100
#> 2  2     1 2016 120

# Make a new frame containing the original values and the weights
new_dat <- left_join(dat,weights, by = c("Group","Year","ID"))

# Add a column for weight
new_dat %>% 
  filter(Year>2013) %>% 
  group_by(Group, Year, Field) %>% 
  summarize(m = weighted.mean(VALUE,w)) %>%
  ungroup() 
#> `summarise()` regrouping output by 'Group', 'Year' (override with `.groups` argument)
#> # A tibble: 2 x 4
#>   Group  Year Field     m
#>   <dbl> <dbl> <chr> <dbl>
#> 1     1  2016 AA     13.3
#> 2     1  2016 TOTAL 111.

reprex package (v0.3.0) 于 2020 年 11 月 3 日创建

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多