我正在尝试在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,等等。 在此示例中,最后一行的得分最低,因此可能是异常值。
答案 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) })