将负值替换为先前记录的平均值和当前值

时间:2018-10-19 13:57:39

标签: r dplyr missing-data zoo mutate

我对问题有3/4分的答案,但在最后部分需要一些帮助。我有一些公司息税前利润的数据。如果息税前利润为负,我想用上一年和当年的平均值代替该值,例如,如果公司在1993年录得负息税前利润,我想得到负年的平均值(1993)和前一年(1992)。

我有以下代码(我在Stackoverflow How to replace NA with mean by subset in R (impute with plyr?)上找到了),但是我想更改impute.mean函数以反映我想要的更改。那就是我真的不想将负数转换为NA

years <- c(1990, 1991, 1992, 1993, 1994)
gvkey <- c(1000, 1100, 1200, 1300, 1400, 1500)

join <- as.data.frame(rep_len(years, length.out = length(gvkey) * 
length(years)))
join$gvkey <- rep(gvkey, length(years))
join$ebit <- runif(nrow(join), min=-100, max=100)

join$ebit[join$ebit < 0] <- NA    ## very inefficient way of recognizing negative values 

colnames(join) <- c("year", "gvkey", "ebit")

impute.mean <- function(x) replace(x, is.na(x), mean(x, na.rm = TRUE))

join <- join %>%
group_by(gvkey) %>%
 mutate(
  ebit = impute.mean(ebit))

我还发现这很理想,除了NA问题R replacing missing values with the mean of surroundings values

x <- (na.locf(join) + rev(na.locf(rev(join))))/2

1 个答案:

答案 0 :(得分:0)

这似乎可以完成工作。现在的问题是连续两年是否为负数.....

y <- join%>%group_by(gvkey)%>%mutate(adj_ebit=purrr::accumulate(ebit,~ifelse(.y<0,(.y+.x)/2,.y)))