行距离计算

时间:2017-07-02 11:03:46

标签: r

我在r

中有以下数据框
  count1      count2      count3    Count4
    0           12          11        0
    12          0           44        23
    22          32          0         12

我想在行上应用的公式就像这样

  1st row     sqrt((count2-count3)^2)
  2nd row     sqrt((count1-count3)^2 + (count1-count4)^2 + (count3-count4)^2)
  3rd row     sqrt((count1-count2)^2 + (count1-count4)^2 + (count2-count4)^2) 

我不想考虑零值的列。我上面有6列。我怎么能在r?

中做到这一点

申请循环并检查非零元素的每一行是一项繁琐的工作。

1 个答案:

答案 0 :(得分:2)

使用:

apply(df, 1, function(x) {
  y <- x[x!=0]
  yc <- combn(y,2)
  sqrt(sum(apply(yc, 2, function(x) (x[1] - x[2])^2)))
})

给出:

[1]   1.00000  39.82462  24.49490 776.72389

您可以将其缩短为:

apply(df, 1, function(x) {
  sqrt(sum(apply(combn(x[x!=0],2), 2, function(x) (x[1] - x[2])^2)))
})

回应your comment

out <- apply(df, 1, function(x) {
  y <- x[x!=0]
  yc <- combn(y,2)
  sqrt(sum(apply(yc, 2, function(x) (x[1] - x[2])^2)))
})

100*out/max(out)

给出:

[1]   0.1287459   5.1272551   3.1536171 100.0000000

使用过的数据:

df <- structure(list(count1 = c(0L, 12L, 22L, 160L), count2 = c(12L, 0L, 32L, 621L), 
                     count3 = c(11L, 44L, 0L, 573L), count4 = c(0L, 23L, 12L, 624L)), 
                .Names = c("count1", "count2", "count3", "count4"), class = "data.frame", row.names = c(NA, -4L))

看起来像:

> df
  count1 count2 count3 count4
1      0     12     11      0
2     12      0     44     23
3     22     32      0     12
4    160    621    573    624
相关问题