我正在使用一个数据表,其中包含气象站的距离矩阵(以米为单位)。从一个桩号到另一个桩号的距离组织在数据表的每一列中。
下面是数据的样子:
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到自身(零)以及到桩号10、100、1000和1002的距离。从此以后,以列为单位。
我有兴趣了解距离每个车站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的维度,那么实现预期结果的最快方法是什么?
发布于 2020-09-26 08:42:12
由于您的数据集是对称的,因此我们只能考虑上/下三角形。
library(dplyr)
df[upper.tri(df)] <- NA我们可以获得长格式的数据,根据breaks对值进行cut,计算每个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 100https://stackoverflow.com/questions/64072703
复制相似问题