R中距离矩阵的最小最大值和平均值

Min Max and Mean values from Distance Matrix in R

我有按患者 ID 分组的细胞的 x、y 坐标:

PatientID cX cY
1 5348 4902
1 6360 4887
1 5398 4874
2 5348 4902
2 6360 4887
2 5398 4874

其中每一行是单个单元格的 x、y 及其关联的患者 ID。

基本上我想做的是为每个患者 ID 创建一个距离矩阵,并计算每个单独单元格的最小、最大和平均距离值,并将它们作为列添加到原始数据框中。

我将您的数据变成可用的形式:

patient_data <- data.frame(
  PatientId = c(1, 1, 1, 2, 2, 2),
  cX = c(5348, 6360, 5398, 5348, 6360, 5398),
  cY = c(4902, 4887, 4874, 4902, 4887, 4874)
)
  PatientId   cX   cY
1         1 5348 4902
2         1 6360 4887
3         1 5398 4874
4         2 5348 4902
5         2 6360 4887
6         2 5398 4874

那么您正在寻找 dplyr::group_bydplyr::group_modify 函数。您可以使用 dplyr::group_map 检查不同步骤的输出。

library(magrittr)

patient_data %>%
  dplyr::group_by(PatientId) %>%
  dplyr::group_modify(~ {
    distance_matrix <- .x %>% dist(diag = FALSE, upper = TRUE) %>% as.matrix() # get distance matrix
    diag(distance_matrix) <- NA # set diagonal values to NA
  data.frame( # get min/max/avg for each row of the distance matrix
    cell_id = seq(nrow(distance_matrix)),
    min_dist = apply(distance_matrix, MARGIN = 1, FUN = min, na.rm = TRUE),
    max_dist = apply(distance_matrix, MARGIN = 1, FUN = max, na.rm = TRUE),
    avg_dist = apply(distance_matrix, MARGIN = 1, FUN = mean, na.rm = TRUE)
  )
  })
# A tibble: 6 × 5
# Groups:   PatientId [2]
  PatientId cell_id min_dist max_dist avg_dist
      <dbl>   <int>    <dbl>    <dbl>    <dbl>
1         1       1     57.3    1012.     535.
2         1       2    962.     1012.     987.
3         1       3     57.3     962.     510.
4         2       1     57.3    1012.     535.
5         2       2    962.     1012.     987.
6         2       3     57.3     962.     510.