我如何 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
我有一个不平衡的面板数据。简化示例如下:
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