Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/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_Euclidean Distance_Sapply - Fatal编程技术网

R中归一化欧氏距离的计算

R中归一化欧氏距离的计算,r,euclidean-distance,sapply,R,Euclidean Distance,Sapply,我的数据框架如下: Binning_data[1:4,] person_id V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16 1 312 74 80 NA 87 90.0 85 88 98 96.5 99 94 95 90 90 93 106 2 316 NA NA 116 106 105.0 110 102 105 105.0 102 98 1

我的数据框架如下:

Binning_data[1:4,]
  person_id  V1  V2  V3  V4    V5  V6  V7  V8    V9 V10 V11 V12 V13 V14 V15 V16
1       312  74  80  NA  87  90.0  85  88  98  96.5  99  94  95  90  90  93 106
2       316  NA  NA 116 106 105.0 110 102 105 105.0 102  98 101  98  92  89  91
3       318  71  61  61  61  60.5  68  62  67  64.0  60  59  60  62  59  63  63
4       319  64  NA  80  80  83.0  84  87  83  85.0  88  87  95  74  70  63  83
我想计算一个给定的“index_person_id”(比如312)与所有其他person_id之间的欧几里德距离,同时忽略所有NAs

例如:“312”和“316”之间的标准化欧几里德距离应忽略前3个存储单元(V1、V2、V3),因为两行中至少有一行具有NAs。它应该只计算从第4个箱子到第16个箱子的欧几里德距离,然后除以13(非空箱子的数量)

Binning_数据的尺寸为10000*17

输出文件的大小应为10000*2,第一列为person_id,第二列为“标准化欧几里德距离”

我目前正在使用sapply用于此目的:

index_person<-binning_data[which(binning_data$person_id==index_person_id),]
non_empty_index_person=which(is.na(index_person[2:ncol(index_person)])==FALSE)

distance[,2]<-sapply(seq_along(binning_data$person_id),function(j) {

compare_person<-binning_data[j,]    
non_empty_compare_person=which(is.na(compare_person[2:ncol(compare_person)])==FALSE)
non_empty=intersect(non_empty_index_person,non_empty_compare_person)
distance_temp=(index_person[non_empty+1]-compare_person[non_empty+1])^2
as.numeric(mean(distance_temp))    
})

index\u person如果我运行你的代码,我会得到:

 0.0000 146.0192 890.9000 200.8750
如果将数据帧转换为矩阵,进行转置,则可以减去列,然后使用
na.rm=TRUE
on
mean
获得所需的距离。可以使用
colMeans
对列执行此操作。以下是示例数据的第二行
II

> II = 1
> m = t(as.matrix(binning_data[,-1]))
> colMeans((m - m[,II])^2, na.rm=TRUE)
       1        2        3        4 
  0.0000 146.0192 890.9000 200.8750 
然后,10000x2矩阵为(其中10000==4):

如果要为给定的索引列表计算此值,请循环它,可能像这样使用
lappy
rbind
将其作为更改的数据帧重新组合在一起:

II = c(1,2,1,4,4)
do.call(rbind,lapply(II, function(i){data.frame(i,d=colMeans((m-m[,i])^2,na.rm=TRUE))}))
   i         d
1  1    0.0000
2  1  146.0192
3  1  890.9000
4  1  200.8750
11 2  146.0192
21 2    0.0000
31 2 1595.0179
41 2  456.7143
12 1    0.0000
22 1  146.0192
32 1  890.9000
42 1  200.8750
13 4  200.8750
23 4  456.7143
33 4  420.8833
43 4    0.0000
14 4  200.8750
24 4  456.7143
34 4  420.8833
44 4    0.0000
这是一个
4x长度(II)
-行矩阵

II = c(1,2,1,4,4)
do.call(rbind,lapply(II, function(i){data.frame(i,d=colMeans((m-m[,i])^2,na.rm=TRUE))}))
   i         d
1  1    0.0000
2  1  146.0192
3  1  890.9000
4  1  200.8750
11 2  146.0192
21 2    0.0000
31 2 1595.0179
41 2  456.7143
12 1    0.0000
22 1  146.0192
32 1  890.9000
42 1  200.8750
13 4  200.8750
23 4  456.7143
33 4  420.8833
43 4    0.0000
14 4  200.8750
24 4  456.7143
34 4  420.8833
44 4    0.0000