首页 > 解决方案 > R - 所有数据表列的分箱频率

问题描述

我正在使用包含气象站距离矩阵(以米为单位)的数据表。从一个站点到另一个站点的距离组织在数据表的每一列中。

数据如下所示:

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到自身(零)和站的距离10100和。此后,按列。10001002

我有兴趣找出距离每个车站 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,那么达到预期结果的最快方法是什么?

标签: rdata.tablefrequency

解决方案


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

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

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

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

推荐阅读