如何通过 R 中的 X 和 Y 坐标按组查找数据框中的异常值?
How to find outliers in a Data Frame by group with X and Y coordinates in R?
我需要在 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.
我设法按组制作了一个散点图,如下所示:
22334444
22335544
11335552
但我没能通过自动聚类(最近邻?)作为新的 Dataframe 按组获取异常值。
(和 Lars 一样,他离第 2 组的其他人很远)
有一个像
这样的DF就好了
Outliers_DF
Name, Group,X, Y
Lars, 2, 100, 50
Sam, 3, 900, 70
Trixi, 11, 200 , 2
一个循环如何按组对矩阵进行子集化,并对每个子集的距离矩阵执行层次聚类。然后,您可以从输出中的每个 hclust
对象检索最外围观察的详细信息。首先你获取组列并找到唯一的组数,然后为输出预分配这个长度的列表。
grpcol <- df$Group
ngroup <- unique(grpcol)
output <- vector("list", length(unique(grpcol)))
现在我们 运行 我们的循环:"For every group in df
, subset the corresponding matrix, run hclust
on its distance matrix, and put the resultant object in the preallocated list."
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 轻松找到如何执行此操作。)另外,您必须考虑一个标准来确定什么是异常值,您可以查看交叉验证以获得对此的良好意见。
我需要在 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.
我设法按组制作了一个散点图,如下所示:
22334444
22335544
11335552
但我没能通过自动聚类(最近邻?)作为新的 Dataframe 按组获取异常值。
(和 Lars 一样,他离第 2 组的其他人很远)
有一个像
这样的DF就好了 Outliers_DF
Name, Group,X, Y
Lars, 2, 100, 50
Sam, 3, 900, 70
Trixi, 11, 200 , 2
一个循环如何按组对矩阵进行子集化,并对每个子集的距离矩阵执行层次聚类。然后,您可以从输出中的每个 hclust
对象检索最外围观察的详细信息。首先你获取组列并找到唯一的组数,然后为输出预分配这个长度的列表。
grpcol <- df$Group
ngroup <- unique(grpcol)
output <- vector("list", length(unique(grpcol)))
现在我们 运行 我们的循环:"For every group in df
, subset the corresponding matrix, run hclust
on its distance matrix, and put the resultant object in the preallocated list."
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 轻松找到如何执行此操作。)另外,您必须考虑一个标准来确定什么是异常值,您可以查看交叉验证以获得对此的良好意见。