R - 所有数据 table 列的合并频率

R - binned frequency for all data table columns

我正在处理包含气象站距离矩阵(以米为单位)的数据 table。从一个站到其他站的距离组织在数据的每一列中 table.

数据如下:

library(data.table)

df <- structure(list(`1` = c(NA, 183861.946148085, 455184.652723047,
84776.9412266853, 471037.870714541), `10` = c(183861.946148085,
NA, 323843.574006837, 268617.304324823, 456775.683807133), `100` = c(455184.652723047,
323843.574006837, NA, 527585.966416289, 757973.787598604), `1000` = c(84776.9412266853,
268617.304324823, 527585.966416289, NA, 498646.318627207), `1002` = c(471037.870714541,
456775.683807133, 757973.787598604, 498646.318627207, NA)), class = "data.frame", row.names = c(NA,
-5L))

dt <- setDT(df)

           1       10      100      1000     1002
1:        NA 183861.9 455184.7  84776.94 471037.9
2: 183861.95       NA 323843.6 268617.30 456775.7
3: 455184.65 323843.6       NA 527585.97 757973.8
4:  84776.94 268617.3 527586.0        NA 498646.3
5: 471037.87 456775.7 757973.8 498646.32       NA

其中第一列显示从站 1 到其自身(零)以及到站 1010010001002 的距离.从今以后,按列排列。

我想知道距离每个站点 100、150、250 和 500 公里以内的站点数量。

因此,对于每一列,我想确定位于 breaks <- c(100000, 150000, 250000, 500000).

范围内的值的计数(和比例)

预期输出为:

ID      distance count prop
1       0-100000 1       25
1  100000-150000 0        0
1  150000-250000 1       25
1  250000-500000 2       50
    ...

我的真实数据集的尺寸为 1500 x 1500,那么达到预期结果的最快方法是什么?

由于您的数据集是对称的,我们只能考虑 upper/lower 个三角形。

library(dplyr)
df[upper.tri(df)] <- NA

我们可以得到长格式的数据,cut根据breaks取值,计算每个Id的count和比例

df %>%
  tidyr::pivot_longer(cols = everything(), 
                      values_drop_na = TRUE) %>%
  count(name, value = cut(value, c(-Inf, breaks, Inf), c('0-100000',
         '100000-150000', '150000-250000', '250000-500000', '500000+'))) %>%
  group_by(name) %>%
  mutate(prop = n/sum(n) * 100)

#  name  value             n  prop
#  <chr> <fct>         <int> <dbl>
#1 1     0-100000          1    25
#2 1     150000-250000     1    25
#3 1     250000-500000     2    50
#4 10    250000-500000     3   100
#5 100   500000+           2   100
#6 1000  250000-500000     1   100