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_by
和 dplyr::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.
我有按患者 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_by
和 dplyr::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.