R中的属性值频率(分类变量中的异常值)

时间:2015-09-08 13:31:16

标签: r

我正在尝试在R中对分类数据(A.Koufakou,E.G。Ortiz,等人http://www.enriquegortiz.com/publications/outlierDetection_ictai07.pdf)中的离群值检测实施AVF算法。 我的数据集是~500,000行,13个变量(所有分类)。

伪代码非常简单:

# Label all data points as non-outliers
# calculate frequency of each attribute value
# foreach point x
#   AVFscore = Sum(frequency each attrib. value in x)/num.attribs
# end foreach
# return top k outliers with minimum AVFscore

为了获得每个属性值的频率,我使用了

freq_matrix <- apply(mydata, MARGIN = 2, FUN = count) # from plyr

给了我一个数据帧列表,每个变量一个,每个变量的频率。到目前为止一切都很好。

我一直在想弄清楚如何迭代每一行并获得'AVFscore' - 我确定我需要使用apply()但是无法理解它应该如何工作。基本上对于每一行,我需要从freq_matrix中查找每个值的频率并求它们,然后除以变量的数量(即13)。

示例:

Country_cde    Flag1     Flag2      Score
IE               A         X         9/13
IE               B         X         7/13
US               A         X         8/13
US               A         Y         6/13
IE               C         Z         5/13

所以我知道对于country_cde,IE的频率是3,US是2.对于Flag1,A是3,B是1,C是1,等等。 在此示例中,最后一行的得分最低,因此可能是异常值。

1 个答案:

答案 0 :(得分:4)

Base R方法:

mydata <- read.table(text="Country_cde    Flag1     Flag2
IE               A         X
IE               B         X
US               A         X
US               A         Y
IE               C         Z",header=T,stringsAsFactors=F)

freq_matrix <- table( unlist( unname(mydata) ) ) # Other way to count the occurrences

mydata[,"Score"] <- apply( mydata,1, function(x) { paste0( sum(freq_matrix[x]) ,"/", length(x) )}) # Do the sum, paste with number of cols (should be computed outside to avoid cache miss)

输出:

> mydata
  Country_cde Flag1 Flag2 Score
1          IE     A     X   9/3
2          IE     B     X   7/3
3          US     A     X   8/3
4          US     A     Y   6/3
5          IE     C     Z   5/3

如果你想要实际的除法值,请像这样删除paste0:

mydata[,"Score"] <- apply(mydata,1,function(x) { sum(freq_matrix[x]) / length(x) })