如何计算不包括自有公司的行业中位数

时间:2019-06-20 18:01:13

标签: r median

我需要创建一个新列,其中包含特定行业(SIC)中ETR变量的中位数,用于样本公司。

但是,在计算ETR的行业(SIC)中位数之前,我需要排除自己的公司。

有人对我如何做到这一点有任何建议吗?

任何帮助将不胜感激。

谢谢!

样本数据:

Firm SIC ETR
1   20  10
2   20  15
3   20  20
4   20  25
5   20  30
6   21  50
7   21  55
8   21  60
9   21  65
10  21  70

应该成为:

Firm SIC ETR ETR_Median
1   20  10  22.5
2   20  15  22.5
3   20  20  20
4   20  25  17.5
5   20  30  17.5
6   21  50  62.5
7   21  55  62.5
8   21  60  60
9   21  65  57.5
10  21  70  57.5

因此,例如,仅考虑同一行业的其他公司(SIC),第4家公司的行业(SIC)中位数为17.5。

2 个答案:

答案 0 :(得分:2)

请考虑按 SIC 组进行拆分,并遍历其所有 Firm 值以排除在median计算之外。具体来说,使用:

  • by(用于分组为dfs子集)
  • sapply(以遍历 Firm 的值并调用median
  • unlist(将列表转换为矢量以进行df列绑定)

一起:

df$ETR_median <- unlist(by(df, df$SIC, function(sub)
    sapply(sub$Firm, function(f) median(sub$ETR[sub$Firm != f]))
))

df

#    Firm SIC ETR ETR_median
# 1     1  20  10       22.5
# 2     2  20  15       22.5
# 3     3  20  20       20.0
# 4     4  20  25       17.5
# 5     5  20  30       17.5
# 6     6  21  50       62.5
# 7     7  21  55       62.5
# 8     8  21  60       60.0
# 9     9  21  65       57.5
# 10   10  21  70       57.5

答案 1 :(得分:1)

您可以在进行中值计算之前创建一个排除当前观测值的函数:

median_excl <- function(x){
  # pre-allocate our result vector:
  med_excl <- vector(length = length(x))
  # loop through our vector, excluding the current index and taking the median:
  for(i in seq_along(x)){
    x_excl <- x[-i]
    med <- median(x_excl)

    med_excl[i] <- med
  }
  return(med_excl)
}

然后只需使用dplyr即可应用它,或者您选择了:

df %>% group_by(SIC) %>% mutate(ETR_Median = median_excl(ETR))

#    Firm SIC ETR ETR_median
# 1     1  20  10       22.5
# 2     2  20  15       22.5
# 3     3  20  20       20.0
# 4     4  20  25       17.5
# 5     5  20  30       17.5
# 6     6  21  50       62.5
# 7     7  21  55       62.5
# 8     8  21  60       60.0
# 9     9  21  65       57.5
# 10   10  21  70       57.5