【问题标题】:row wise distance calculation逐行距离计算
【发布时间】:2017-07-02 11:03:46
【问题描述】:

我在 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 中做到这一点?

应用 for 循环并检查每一行的非零元素是一项繁琐的任务。

【问题讨论】:

    标签: r


    【解决方案1】:

    使用:

    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
    

    【讨论】:

    • 如果我有 6 列怎么办?我必须在公式中更改什么?
    • @Neil 无需更改任何内容,这也适用于 6 列,因为您将函数应用于非常行
    • 假设数字是 (160,621,573,624) 公式是 sqrt((160 - 621)^2 + (160-573)^2 + (160 - 624)^2 + (621 - 573)^2 + (621-624)^2 + (573 - 624)^2 ) 根据你的代码它即将到来的 1190,实际是 776
    • @Neil 将这些值作为额外的一行添加到示例数据中;代码给出了正确的输出;查看更新
    • @Neil 将结果向量中的所有内容除以最大值并乘以 100;另见更新,HTH
    猜你喜欢
    • 2020-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    相关资源
    最近更新 更多