R中的多维度聚类/匹配

时间:2014-10-09 21:14:29

标签: r sorting cluster-analysis

我有一个非常庞大而复杂的数据集,其中有很多公司的观察结果。这些公司的一些观察是多余的,我需要做出一个关键,将冗余的观察结果映射到一个单独的观察。然而,判断他们是否实际代表同一家公司的唯一方法是通过各种变量的相似性。我认为适当的方法是基于各种条件或甚至某种倾向得分匹配的一种聚类。也许我只需要灵活的工具来制作复杂的相似性矩阵。

不幸的是,我不太确定如何在R中进行。我已经看到的用于聚类和分类的大多数工具似乎都使用数字距离或分类数据,但不要这样做。似乎允许多个条件或用户指定的条件。

下面我尝试创建一个较小的公开示例,说明我正在使用的数据类型以及我尝试生成的结果。有些条件必须适用,例如,位置必须相同。有些功能可能会将一个功能与另一个功能相关联,例如var1和var2。然后有一些功能可以将一个与另一个相关联,但它们不能冲突,例如var3。

另一层复杂性是我试图用来映射冗余观察的关联类型各不相同。例如,id1和id2是两次冗余输入数据的同一公司。在一个地方,它的名字是" apples"和另一个红苹果"。它们共享相同的位置,var1值和var3(在调整格式之后)。类似地,ids 3,5和6也实际上只是一家公司,尽管每种公司的大部分输入都是不同的。一些集群将识别多个观察,而其他集群将只有一个观察。理想情况下,我想找到一种方法,根据几个条件对观察结果进行分类或关联,例如: 1.测试位置是否相同 2.测试var3是否不同 3.测试名称是否是其他人的子串 4.测试名称的编辑距离 5.测试观察之间var1和var2的相似性

无论如何,希望有更好,更灵活的工具,而不是我发现或有人在R中使用这种数据工作的经验。非常感谢所有建议和建议!

数据

id  name        location    var1    var2    var3
1   apples        US        1       abc     12345
2   red apples    US        1       NA      12-345
3   green apples  Mexico    2       def     235-92
4   bananas       Brazil    2       abc     NA
5   oranges       Mexico    2       NA      23592
6   green apple   Mexico    NA      def     NA
7   tangerines    Honduras  NA      abc     3498
8   mango         Honduras  1       NA      NA
9   strawberries  Honduras  NA      abcd    3498
10  strawberry    Honduras  NA      abc     3498
11  blueberry     Brazil    1       abcd    2348
12  blueberry     Brazil    3       abc     NA
13  blueberry     Mexico    NA      def     1859
14  bananas       Brazil    1       def     2348
15  blackberries  Honduras  NA      abc     NA
16  grapes        Mexico    6       qrs     NA
17  grapefruits   Brazil    1       NA      1379
18  grapefruit    Brazil    2       bcd     1379
19  mango         Brazil    3       efaq    NA
20  fuji apples   US        4       NA      189-35

结果

id  name        location    var1    var2    var3        Result
1   apples        US        1       abc     12345       1
2   red apples    US        1       NA      12-345      1
3   green apples  Mexico    2       def     235-92      3
4   bananas       Brazil    2       abc     NA          4
5   oranges       Mexico    2       NA      23592       3
6   green apple   Mexico    NA      def     NA          3
7   tangerines    Honduras  NA      abc     3498        7
8   mango         Honduras  1       NA      NA          8
9   strawberries  Honduras  NA      abcd    3498        7
10  strawberry    Honduras  NA      abc     3498        7
11  blueberry     Brazil    1       abcd    2348        11
12  blueberry     Brazil    3       abc     NA          11
13  blueberry     Mexico    NA      def     1859        13
14  bananas       Brazil    1       def     2348        11
15  blackberries  Honduras  NA      abc     NA          15
16  grapes        Mexico    6       qrs     NA          16
17  grapefruits   Brazil    1       NA      1379        17
18  grapefruit    Brazil    2       bcd     1379        17
19  mango         Brazil    3       efaq    NA          19
20  fuji apples   US        4       NA      189-35      20

提前感谢您的时间和帮助!

1 个答案:

答案 0 :(得分:0)

library(stringdist)
getMatches <- function(df, tolerance=6){
  out <- integer(nrow(df))
  for(row in 1:nrow(df)){
    dists <- numeric(nrow(df))
    for(col in 1:ncol(df)){
      tempDist <- stringdist(df[row, col], df[ , col], method="lv")

      # WARNING: Matches NA perfectly.
      tempDist[is.na(tempDist)] <- 0
      dists <- dists + tempDist
    }
    dists[row] <- Inf

    min_dist <- min(dists)
    if(min_dist < tolerance){
      out[row] <- which.min(dists)
    }
    else{
      out[row] <- row
    }
  }
  return(out)
}

test$Result <- getMatches(test[, -1])

test是您的数据。这可能肯定需要一些改进,当然需要一些后处理。这将创建一个索引最接近的列。如果在给定的容差范围内找不到匹配项,则返回自身的索引。

编辑:我稍后会再尝试。