Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R中多维度的聚类/匹配_R_Sorting_Cluster Analysis - Fatal编程技术网

R中多维度的聚类/匹配

R中多维度的聚类/匹配,r,sorting,cluster-analysis,R,Sorting,Cluster Analysis,我有一个非常庞大而复杂的数据集,其中包含许多对公司的观察。公司的一些观察结果是多余的,我需要制作一个键,将多余的观察结果映射到单个观察结果。然而,判断他们是否代表同一家公司的唯一方法是通过各种变量的相似性。我认为合适的方法是基于各种条件的聚类,或者甚至是某种倾向评分匹配。也许我只是需要灵活的工具来制作一个复杂的相似矩阵 不幸的是,我不太确定如何在R中实现这一点。我见过的大多数用于聚类和分类的工具似乎都使用数字距离或分类数据,但似乎不允许使用多个条件或用户指定的条件 下面,我尝试创建一个较小的公开

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

不幸的是,我不太确定如何在R中实现这一点。我见过的大多数用于聚类和分类的工具似乎都使用数字距离或分类数据,但似乎不允许使用多个条件或用户指定的条件

下面,我尝试创建一个较小的公开示例,说明我正在处理的数据类型和我试图产生的结果。必须应用某些条件,例如,位置必须相同。有些功能可能会相互关联,例如var1和var2。还有一些特性可能相互关联,但它们不能冲突,例如var3

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

无论如何,希望有更好的,更灵活的工具,这比我所发现的,或有人有这种经验的数据工作在R。任何和所有的建议和建议都非常感谢

资料

结果

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
提前感谢您的时间和帮助

库(stringdist)
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])

getMatches我们称之为“困难”问题。我认为在每个变量中创建数字距离的方法是使用。然后可以为匹配的总距离定义一些公差。编辑:我会尝试模拟一些东西。还有一些软件包可以帮助你检查与角色的相似性。这将允许您得出“苹果”和“红苹果”在同一个簇中的结论。@Adii\u不会有任何包将
“苹果”
匹配到
“红苹果”
,也不会有任何其他苹果在其中。@Ishulduseaname您想打赌吗?:)@再见。。。当然我会留下深刻印象的!谢谢你的帮助。我将对此稍加修改,看看是否能让这样的东西起作用。
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])