R 语言:如何计算每年每个行业内,小于该企业对应值的所有企业的均值

今天有个小伙伴问了这样一个问题:

如何计算每年每个行业内,小于该企业对应值的所有企业的均值?

这个问题可以这样解决,我准备了一个示例数据:

library(tidyverse)
haven::read_dta("data.dta") -> df

df

#> # A tibble: 110 × 4
#> 年份 企业名称 行业门类名称 工业总产值_当年价格千元
#> <dbl> <chr> <chr> <dbl>
#> 1 1998 上海天厨氨基酸厂 制造业 1790
#> 2 1998 下蜀房地产开发公司预制厂 制造业 6214
#> 3 1998 北流市国马水泥厂 制造业 6954
#> 4 1998 四川省什邡建川实业总公司 制造业 27575
#> 5 1998 环城环玉粘合剂厂 制造业 20160
#> 6 1998 邗江县头桥金属家具厂 制造业 10080
#> 7 1998 北京市怀柔县崎峰茶黄金采选厂 采掘业 11176
#> 8 1999 地方国营宁波针织衫厂 制造业 145982
#> 9 1999 永泰县食品厂 制造业 261
#> 10 1999 津宝梅丝饮品有限公司 制造业 5630
#> # ℹ 100 more rows

假如这里我们想计算每年每个行业内,小于每个企业的工业总产值_当年价格千元值的企业均值。由于 工业总产值_当年价格千元 变量可能有相同的(这个示例数据中没有),所以我们先去除重复的:

df %>%
# 去除重复值
distinct(年份, 行业门类名称, 工业总产值_当年价格千元)

#> # A tibble: 110 × 3
#> 年份 行业门类名称 工业总产值_当年价格千元
#> <dbl> <chr> <dbl>
#> 1 1998 制造业 1790
#> 2 1998 制造业 6214
#> 3 1998 制造业 6954
#> 4 1998 制造业 27575
#> 5 1998 制造业 20160
#> 6 1998 制造业 10080
#> 7 1998 采掘业 11176
#> 8 1999 制造业 145982
#> 9 1999 制造业 261
#> 10 1999 制造业 5630
#> # ℹ 100 more rows

然后我们把数据按照 年份, 行业门类名称, 工业总产值_当年价格千元 排序:

df %>%
distinct(年份, 行业门类名称, 工业总产值_当年价格千元) %>%
arrange(年份, 行业门类名称, 工业总产值_当年价格千元)
#> # A tibble: 110 × 3
#> 年份 行业门类名称 工业总产值_当年价格千元
#> <dbl> <chr> <dbl>
#> 1 1998 制造业 1790
#> 2 1998 制造业 6214
#> 3 1998 制造业 6954
#> 4 1998 制造业 10080
#> 5 1998 制造业 20160
#> 6 1998 制造业 27575
#> 7 1998 采掘业 11176
#> 8 1999 制造业 261
#> 9 1999 制造业 5630
#> 10 1999 制造业 46700
#> # ℹ 100 more rows

这样,工业总产值 变量就是从小到大的顺序排列了,然后计算累加:

df %>%
# 去除重复值
distinct(年份, 行业门类名称, 工业总产值_当年价格千元) %>%
arrange(年份, 行业门类名称, 工业总产值_当年价格千元) %>%
# 计算累加
group_by(年份, 行业门类名称) %>%
mutate(sum = cumsum(工业总产值_当年价格千元))
#> # A tibble: 110 × 4
#> # Groups: 年份, 行业门类名称 [24]
#> 年份 行业门类名称 工业总产值_当年价格千元 sum
#> <dbl> <chr> <dbl> <dbl>
#> 1 1998 制造业 1790 1790
#> 2 1998 制造业 6214 8004
#> 3 1998 制造业 6954 14958
#> 4 1998 制造业 10080 25038
#> 5 1998 制造业 20160 45198
#> 6 1998 制造业 27575 72773
#> 7 1998 采掘业 11176 11176
#> 8 1999 制造业 261 261
#> 9 1999 制造业 5630 5891
#> 10 1999 制造业 46700 52591
#> # ℹ 100 more rows

因为已经按照从小到大的顺序排列了,并且去除了重复值,所以累加值减去自身就是比自己小的值的总和了:

df %>%
# 去除重复值
distinct(年份, 行业门类名称, 工业总产值_当年价格千元) %>%
arrange(年份, 行业门类名称, 工业总产值_当年价格千元) %>%
# 计算累加
group_by(年份, 行业门类名称) %>%
mutate(sum = cumsum(工业总产值_当年价格千元) - 工业总产值_当年价格千元)
#> # A tibble: 110 × 4
#> # Groups: 年份, 行业门类名称 [24]
#> 年份 行业门类名称 工业总产值_当年价格千元 sum
#> <dbl> <chr> <dbl> <dbl>
#> 1 1998 制造业 1790 0
#> 2 1998 制造业 6214 1790
#> 3 1998 制造业 6954 8004
#> 4 1998 制造业 10080 14958
#> 5 1998 制造业 20160 25038
#> 6 1998 制造业 27575 45198
#> 7 1998 采掘业 11176 0
#> 8 1999 制造业 261 0
#> 9 1999 制造业 5630 261
#> 10 1999 制造业 46700 5891
#> # ℹ 100 more rows

然后除以对应的数量就是要求的均值了:

df %>%
# 去除重复值
distinct(年份, 行业门类名称, 工业总产值_当年价格千元) %>%
arrange(年份, 行业门类名称, 工业总产值_当年价格千元) %>%
# 计算累加
group_by(年份, 行业门类名称) %>%
mutate(sum = cumsum(工业总产值_当年价格千元) - 工业总产值_当年价格千元,
n = 1:n() - 1,
smallmean = sum / n) %>%
select(-sum, -sum, -n) -> df1

df1

#> # A tibble: 110 × 4
#> # Groups: 年份, 行业门类名称 [24]
#> 年份 行业门类名称 工业总产值_当年价格千元 smallmean
#> <dbl> <chr> <dbl> <dbl>
#> 1 1998 制造业 1790 NaN
#> 2 1998 制造业 6214 1790
#> 3 1998 制造业 6954 4002
#> 4 1998 制造业 10080 4986
#> 5 1998 制造业 20160 6260.
#> 6 1998 制造业 27575 9040.
#> 7 1998 采掘业 11176 NaN
#> 8 1999 制造业 261 NaN
#> 9 1999 制造业 5630 261
#> 10 1999 制造业 46700 2946.
#> # ℹ 100 more rows

最后再把 df1 和 df 合并起来即可:

df %>%
left_join(df1) -> dfr

dfr
#> # A tibble: 110 × 5
#> 年份 企业名称 行业门类名称 工业总产值_当年价格…¹ smallmean
#> <dbl> <chr> <chr> <dbl> <dbl>
#> 1 1998 上海天厨氨基酸厂 制造业 1790 NaN
#> 2 1998 下蜀房地产开发公司预制厂 制造业 6214 1790
#> 3 1998 北流市国马水泥厂 制造业 6954 4002
#> 4 1998 四川省什邡建川实业总公司 制造业 27575 9040.
#> 5 1998 环城环玉粘合剂厂 制造业 20160 6260.
#> 6 1998 邗江县头桥金属家具厂 制造业 10080 4986
#> 7 1998 北京市怀柔县崎峰茶黄金采… 采掘业 11176 NaN
#> 8 1999 地方国营宁波针织衫厂 制造业 145982 17530.
#> 9 1999 永泰县食品厂 制造业 261 NaN
#> 10 1999 津宝梅丝饮品有限公司 制造业 5630 261
#> # ℹ 100 more rows
#> # ℹ abbreviated name: ¹工业总产值_当年价格千元

点击这里跳转到 RStata 短书平台获取附件:R 语言:如何计算每年每个行业内,小于该企业对应值的所有企业的均值

评论