我需要为公司样本创建一个新列,其中包含某个行业内的中位数ETR变量(原文如此)。
但是,在计算ETR的行业(原文如此)中值之前,我需要排除自己的公司。
有没有人对我如何做到这一点有什么建议?
任何帮助都将不胜感激。
谢谢!
示例数据:
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。
发布于 2019-06-21 02:49:25
考虑按SIC组拆分,并遍历其所有固定值以从median
计算中排除。具体地说,使用:
by
(用于分组为子集dfs) sapply
(遍历固体值并调用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
发布于 2019-06-21 07:31:45
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
https://stackoverflow.com/questions/56691561
复制相似问题