删除面板数据中异常值的整个观察值

问题描述

我有一个数据集,显示了大约100.000家公司20年的收入。数据还有许多其他变量,但是下面,我以长格式编写了此数据集的简化示例的可复制版本。

my_data <- data.frame(Company = c("A","A","B","C","C"),years = c("2010","2011","2012","2010","2012"),revenue = c(10,11,12,10,956))

我的数据要长得多,但是它遵循这个小样本的结构,其中变量“ company”是我的ID,而我的纵向数据则来自每年的收入。

从这个小样本中您可以看到,C公司在2012年的收入是一个离群值,我不仅要删除该年的观察值,而且要删除所有与C公司有关的观察值。删除一个或多个收入观察值的C公司所有观察值的最佳方法是什么?

在真实数据中,我使用第99位分位数来确定离群值,其代码如下:

my_data$outliers <- ifelse(my_data$revenue >= quantile(my_data$revenue,.0.99,na.rm = TRUE),TRUE,FALSE)

这给了我一列,以标识其各自年份中的异常值。我只是不知道如何删除同一家公司的其他观察结果。

解决方法

首先,my_data$revenue >= quantile(my_data$revenue,.0.99,na.rm = TRUE)已经返回了TRUE中的FALSE,因此不需要ifelse

您可以使用此结果从以下数据集中删除行:

index = my_data$revenue >= quantile(my_data$revenue,na.rm = TRUE)
company = my_data[,1]==my_data[which(index),1]
my_data[-which(company),]
,

您可以获得相应的Company,其中revenue位于第99位以上,并删除该公司的所有行。

在基数R中,您可以这样操作:

subset(my_data,!Company %in% unique(Company[revenue > 
                 quantile(revenue,0.99,na.rm = TRUE)]))

#  Company years revenue
#1       A  2010      10
#2       A  2011      11
#3       A  2012      12
#4       B  2010      10
#5       B  2011      12
#6       B  2012      11

如果您更喜欢dplyr,也可以在dplyr中编写相同的代码:

library(dplyr)

my_data %>%
  filter(!Company %in% unique(Company[revenue > 
                       quantile(revenue,na.rm = TRUE)]))

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...