1

我正在尝试准备一个dist结构以与 R 中的一个聚类库一起使用。输入是一个包含固定大小的整数向量的文件。这是一个示例输入,尽管实际输入的每行将有超过 7 列。

54540,22060,52234,49984,34093,16412,46758
47075,41863,26267,8577,45153,6133,31558
33741,50895,45860,49942,47074,30793,10483
24437,5884,44081,34891,41438,23705,30392
28575,50826,36723,27807,28152,31804,3303
12936,26572,5576,1758,5484,12165,19950
2086,33345,4810,15722,594,34,15562
19701,46650,38306,33724,24992,55188,53023

我想读入它们并让 R 将它们解释为向量,然后应该将其传递myfun给以计算编辑距离作为距离度量。但是,似乎data没有适当的格式,因此myfun使用不正确的参数调用。

我目前有以下代码

library(cluster)                                                   
library(proxy)                                                     

myfun <- function(x,y) {                                           
  numDiffs <- 0;                                                   
  for (i in x) {                                                   
    if (x[i] != y[i])                                              
       numDiffs <- numDiffs + 1;                                   
  }                                                                
  return(numDiffs);                                                
}                                                                  
summary(pr_DB)                                                     

pr_DB$set_entry(FUN = myfun, names = c("myfun", "vectorham"))      
pr_DB$get_entry("MYFUN")                                           

data <- read.table("Sample.txt", header=FALSE, sep=",")            

x <- dist(x = data, method = "MYFUN")                             

当我运行此代码时,我收到以下错误:

Error in if (x[i] != y[i]) numDiffs <- numDiffs + 1 :                     
  missing value where TRUE/FALSE needed                                   
Calls: dist ... .proxy_external -> do.call -> .External -> <Anonymous>    

我试过手动查看,data它似乎是一个矩阵而不是向量的向量,但我不知道如何解决这个问题。

4

2 回答 2

1

问题是线路for (i in x) {。我想你的意思是for (i in seq_along(x)) {。无论如何,请尝试使用它:

myfun <- function(x,y) sum(x != y)

编辑:以下代码:

data <- read.table(header=FALSE, sep=",", text="
54540,22060,52234,49984,34093,16412,46758
47075,41863,26267,8577,45153,6133,31558
33741,50895,45860,49942,47074,30793,10483
24437,5884,44081,34891,41438,23705,30392
28575,50826,36723,27807,28152,31804,3303
12936,26572,5576,1758,5484,12165,19950
2086,33345,4810,15722,594,34,15562
19701,46650,38306,33724,24992,55188,53023
")

library(cluster)                                                   
library(proxy)                                                     

myfun <- function(x,y) sum(x != y)

summary(pr_DB)                                                     

pr_DB$set_entry(FUN = myfun, names = c("myfun", "vectorham"))      
pr_DB$get_entry("MYFUN")                                           


x <- dist(x = data, method = "MYFUN") 

给我以下结果:

> x
  1 2 3 4 5 6 7
2 7            
3 7 7          
4 7 7 7        
5 7 7 7 7      
6 7 7 7 7 7    
7 7 7 7 7 7 7  
8 7 7 7 7 7 7 7
> data
     V1    V2    V3    V4    V5    V6    V7
1 54540 22060 52234 49984 34093 16412 46758
2 47075 41863 26267  8577 45153  6133 31558
3 33741 50895 45860 49942 47074 30793 10483
4 24437  5884 44081 34891 41438 23705 30392
5 28575 50826 36723 27807 28152 31804  3303
6 12936 26572  5576  1758  5484 12165 19950
7  2086 33345  4810 15722   594    34 15562
8 19701 46650 38306 33724 24992 55188 53023

我认为这是正确的。

于 2013-09-11T21:33:26.977 回答
0

几个问题:

  1. 如果 myfun 中的 x 和 y 长度不同,您可能会在需要 TRUE/FALSE 的地方得到缺失值,因为其中一个将为 N/A。

  2. 据我所知,Dist 没有采用您自己定义的函数。见http://stat.ethz.ch/R-manual/R-patched/library/stats/html/dist.html

  3. 费迪南德所说的“i in x”。他的建议很好。

矩阵实际上与向量的向量没有任何不同。只需将行向量称为 data[rowNum, ]。此外,“dist 结构”只是一个矩阵。

于 2013-09-11T21:47:56.740 回答