我如何 trim 在 R 中的不平衡面板数据中超过 99% 的数据?

How do I trim data over 99% in unbalanced panel data in R?

我有一个不平衡的面板数据。简化示例如下:

Firm Year  V1  V2 V3
AAA  2001  0   8   2    
AAA  2002  10  4   2    
BBB  1999  0   8   8    
BBB  2000  7   0   6    
BBB  2001  10  100 1    
BBB  2002  1   5   8    
CCC  2001  2   8   0    
CCC  2002 -98  3  10    

我想做的是 trim 每年每个变量的所有边缘的异常值。 trim 的方法是将 NA 分配给那些值 > 99% 和 < 1% 的数据。例如,对于 2000 年,对于 Var_1,将 NA 分配给所有 > 99% 或 < 1% 的值。理想情况下,在 trim 之后数据将如下所示:

Firm Year  V1  V2 V3
AAA  2001  0   8   2    
AAA  2002  10  4   2    
BBB  1999  0   8   8    
BBB  2000  7   0   6    
BBB  2001  10  NA  1    
BBB  2002  1   5   8    
CCC  2001  2   8   0    
CCC  2002  NA  3   10   

真实数据海量,数据结构不平衡

您可以尝试以下方法一次性标记每年每个变量的离群值。

data.frame(lapply(df[3:5],                                         # variable indices 3:5
           function(y) ave(y, df$Year, FUN=function(x) 
                             ifelse(x < quantile(x, .01) | x > quantile(x, .99), NA, x)))) 

#   V1 V2 V3
# 1 NA  8 NA
# 2 NA  4 NA
# 3  0  8  8
# 4  7  0  6
# 5 NA NA  1
# 6  1 NA  8
# 7  2  8 NA
# 8 NA NA NA