问题描述
我有一个数据集,显示了大约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)]))