【问题标题】:Euclidean distances in dplyr Rdplyr R中的欧几里得距离
【发布时间】:2015-10-05 18:50:38
【问题描述】:

如何计算按某种处理方式分组的观测值之间的距离矩阵。

数据示例:

set.seed(1212)
df <- data.frame(yta = c(rep("A", 3), rep("B", 3)), x = rnorm(6, 10, 2), y = rnorm(6, 40, 12))

我想要得到的输出是这样的

          1         2         3         4         5         6
1            4.234690 25.858459         0         0         0 
2  4.234690           23.503327         0         0         0
3 25.858459 23.503327                   0         0         0
4         0         0         0            9.330203  9.277692
5         0         0         0  9.330203           18.371015
6         0         0         0  9.277692 18.371015      

【问题讨论】:

  • 你确定输出正确吗?
  • 这是错误的。无论yta 如何,现在都会计算这些值,并且我手动插入了 0。正确输出中的数字会有所不同,因为距离将被计算yta wise
  • 提供您如何创建输出的代码
  • as.matrix(df), dist(df[,2:3], method = "euclidean", upper = T) 正如我所说,我手动删除了一些值
  • 首先:示例输出与使用给定dfdist() 的输出无关。然后一个问题:我假设您想要一个立即的解决方案?因为之后使用循环将值更改为 0(df$yta[i] != df$yta[j])非常简单。

标签: r dplyr


【解决方案1】:

使用splitlapplybind_rows我们可以得到这样的东西:

df %>% split(., (.)$yta) %>% lapply(function(df_part) df_part %>% select(-yta) %>% as.matrix %>% 
                                      dist(upper = T) %>% as.matrix %>% as.data.frame) %>% 
  bind_rows %>% mutate(yta = df$yta)

# Source: local data frame [6 x 7]
# 
#           1        2         3        4         5         6 yta
# 1  0.000000 28.43909  4.350409       NA        NA        NA   A
# 2 28.439090  0.00000 32.038712       NA        NA        NA   A
# 3  4.350409 32.03871  0.000000       NA        NA        NA   A
# 4        NA       NA        NA  0.00000 20.267301 29.106135   B
# 5        NA       NA        NA 20.26730  0.000000  9.116934   B
# 6        NA       NA        NA 29.10614  9.116934  0.000000   B

【讨论】:

    猜你喜欢
    • 2013-03-02
    • 2017-01-07
    • 2021-01-31
    • 1970-01-01
    • 2015-07-15
    • 2014-02-04
    • 1970-01-01
    相关资源
    最近更新 更多