R 与字符串兼容的变量特定距离矩阵

R 与字符串兼容的变量特定距离矩阵,r,R,我正在做一个项目,我需要将案例分组。我有npi的数据,有npi的地址、电话和姓名等信息。 我的目标是对同一组中最相似的npi进行分组。我想通过首先创建一个距离矩阵,然后确定 用来将病例分组的树。然而,在如何为字符串变量创建距离矩阵方面,我遇到了困难。 我基本上有两个问题: 首先,如何创建一个距离函数来比较数据帧中案例之间的相似性,并创建一个距离矩阵作为输出? 它们在相同变量上共享的值越多,我希望它们越接近,因此距离矩阵上的分数越高/越低 第二,如何使这个距离函数与字符串变量兼容 代码: 问题:

我正在做一个项目,我需要将案例分组。我有npi的数据,有npi的地址、电话和姓名等信息。 我的目标是对同一组中最相似的npi进行分组。我想通过首先创建一个距离矩阵,然后确定 用来将病例分组的树。然而,在如何为字符串变量创建距离矩阵方面,我遇到了困难。 我基本上有两个问题:

首先,如何创建一个距离函数来比较数据帧中案例之间的相似性,并创建一个距离矩阵作为输出? 它们在相同变量上共享的值越多,我希望它们越接近,因此距离矩阵上的分数越高/越低

第二,如何使这个距离函数与字符串变量兼容

代码:

问题: 1.这里x和y的定义是什么?这些行与所有其他行或其他行形成对比? 使用此定义的函数,距离不是特定于变量的。如果值出现在同一个变量上,我只希望两个案例“相交” 2.我需要向函数添加什么才能使其特定于变量

此外,该方法似乎不适用于字符串变量

代码:

这个距离矩阵毫无意义 问题在于intersect命令:

   > dfstring[1,]
      dier getal mubilair
   51  aap   een    tafel
   > dfstring[2,]
      dier getal mubilair
   52  vis  twee    stoel
   > dfstring[4,]
      dier getal mubilair
   54  kip  drie   fouton
   > intersect(dfstring[1,], dfstring[2,])
   data frame with 0 columns and 0 rows
   > intersect(dfstring[1,], dfstring[4,])
      dier
   54  kip 
有没有像intersect这样的函数也可以处理字符串变量

那么,如何使我的初始函数变量特定,以及如何使它与字符串变量兼容

  • 对于
    x
    y
    ,请将“x行”与“y行”进行比较。将您的函数更改为

    dist_func <- function(x, y) {
      browser()
      length(intersect(x,y))/3
    }
    
    为了得到你想要的,你不只是在寻找简单的平等吗

    dist_func <- function(x, y) sum(x == y)/3
    
    例如,请注意,
    $getal
    中的第一个值是
    “acht”
    ,它是系数内部的整数3。您会注意到,这三列的第四个整数值分别为3、2、3(与列“51”和行“54”中的距离度量
    0.667

    使用
    read.table(…,stringsAsFactors=FALSE)
    或将距离函数更改为:

    dist_func2 <- function(x, y) {
      if (is.factor(x)) x <- as.character(x)
      if (is.factor(y)) y <- as.character(y)
      sum(x == y)/3
    }
    
    dist_func2
    
       > dfstring[1,]
          dier getal mubilair
       51  aap   een    tafel
       > dfstring[2,]
          dier getal mubilair
       52  vis  twee    stoel
       > dfstring[4,]
          dier getal mubilair
       54  kip  drie   fouton
       > intersect(dfstring[1,], dfstring[2,])
       data frame with 0 columns and 0 rows
       > intersect(dfstring[1,], dfstring[4,])
          dier
       54  kip 
    
    dist_func <- function(x, y) {
      browser()
      length(intersect(x,y))/3
    }
    
    Performs *set* union, intersection, ...
    
    dist_func <- function(x, y) sum(x == y)/3
    
    str(df2)
    # 'data.frame': 10 obs. of  4 variables:
    #  $ npi     : int  51 52 53 54 55 56 57 58 59 60
    #  $ dier    : Factor w/ 9 levels "aap","beer","kip",..: 1 8 6 3 2 1 7 9 5 4
    #  $ getal   : Factor w/ 8 levels "acht","drie",..: 3 4 4 2 5 6 7 8 1 1
    #  $ mubilair: Factor w/ 9 levels "bank","bureau",..: 7 6 9 3 3 2 1 4 8 5
    
    dist_func2 <- function(x, y) {
      if (is.factor(x)) x <- as.character(x)
      if (is.factor(y)) y <- as.character(y)
      sum(x == y)/3
    }