作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在 R 中实现 AVF 算法,用于分类数据中的异常值检测(A. Koufakou、E.G. Ortiz 等人 http://www.enriquegortiz.com/publications/outlierDetection_ictai07.pdf )。我的数据集大约有 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,等等。在此示例中,最后一行得分最低,因此可能是异常值。
最佳答案
基础 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) })
关于r - R 中的属性值频率(分类变量中的异常值),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32459197/
我是一名优秀的程序员,十分优秀!