如何在R中按X和Y坐标分组查找数据框中的异常值?

时间:2016-10-29 16:16:00

标签: r coordinates cluster-analysis nearest-neighbor outliers

我需要按 R 中的坐标和组来查找异常值。

我的数据框看起来像:

Name, Group, X, Y
Bob,  2, -300, 20
Karl, 4,  200, 10
Sara, 2, -298, 19
Hans, 4,  210, 12
Anna, 3, -700, 100
Maria,3, -690, 110
Lars, 2,  100, 50
etc.

我设法制作了一个ScatterPlot by Group,它看起来像:

22334444
22335544
11335552

但是我没有设法通过自动聚类(最近邻居?)作为一个新的数据帧来获得Group的异常值。

(和拉尔斯一样,他远离第2组的其他人)

拥有像

这样的DF会很不错
    Outliers_DF
    Name, Group,X,  Y
    Lars,  2,  100, 50
    Sam,   3,  900, 70
    Trixi, 11, 200 , 2

1 个答案:

答案 0 :(得分:0)

如何循环按组子集化矩阵并对每个子集的距离矩阵执行分层聚类。然后,您可以从输出中的每个hclust对象中检索最远离观察的详细信息。首先,您获取组列并找到唯一的组数,然后为输出预先分配此长度的列表。

grpcol <- df$Group
ngroup <- unique(grpcol)
output <- vector("list", length(unique(grpcol)))

现在我们运行循环:“对于df中的每个组,对相应的矩阵进行子集化,在其距离矩阵上运行hclust,并将结果对象放在预分配列表中。”

for (grp in ngroup) {
  mat <- df[df$Group %in% grp, -2]
  output[[grp]] <- hclust(dist(mat))
}

我已经检查过它可以使用这个数据框df(注意我添加了两个额外的人,所以它可以工作):

structure(list(Group = c(2L, 4L, 2L, 4L, 3L, 3L, 2L, 3L, 4L), 
X = c(-300L, 200L, -298L, 210L, -700L, -690L, 100L, -680L, 
220L), Y = c(20, 10, 19, 12, 100, 110, 50, 120, 14)), .Names = c("Group", 
"X", "Y"), class = "data.frame", row.names = c("Bob", "Karl", 
"Sara", "Hans", "Anna", "Maria", "Lars", "Person1", "Person2"))

要获取各个群集,请在所需的群组上使用[,例如output[2]

您需要从$height$order$labels中提取值。 (您可以通过搜索SO轻松找到如何执行此操作。)此外,您必须考虑一个标准来确定什么是异常值,您可以查看Cross Validated以获得对此的良好意见。