我正在尝试按降序对对象大小的向量进行排序,并创建一个数据帧。我在排序时遇到了一个问题,因为数字有单位面额(例如Kb、Mb等(,我想知道如何按升序或降序对数字进行排序?因为数字有面额,所以它们本质上被视为字符向量,因此不能按大小排序。
示例1:
library(dplyr)
l <- list(1:1e6, 1:1e1, 1:1e3, 1:1e7)
l <- sapply(
l,
function(x){
object.size(x) %>% format(units = "auto")
}
)
# Alt. A: Sorting the vector before coercing to dataframe
sort(l) %>% as.data.frame()
A data.frame: 4 × 1
.
<chr>
96 bytes
4 Kb
38.1 Mb
3.8 Mb
# Alt. B: Coerce to dataframe then sort using arrange()
as.data.frame(l) %>% arrange(desc(names(.)[1]))
A data.frame: 4 × 1
l
<chr>
3.8 Mb
96 bytes
4 Kb
38.1 Mb
期望输出:
A data.frame: 4 × 1
l
<chr>
38.1 Mb
3.8 Mb
4 Kb
96 bytes
问题是sapply
循环只保留格式化的输出,这很难排序。使用purrr
,您可以在数据帧中为每个迭代存储两个值,并将结果绑定在一起。所以你可以做:
library(dplyr)
l <- list(1:1e6, 1:1e1, 1:1e3, 1:1e7)
l_1 <- purrr::map_df(l, function(x) {
tibble(
size_raw = object.size(x),
size = size_raw %>% format(units = "auto")
)
})
l_1 %>%
arrange(-size_raw)
#> # A tibble: 4 × 2
#> size_raw size
#> <objct_sz> <chr>
#> 1 40000048 bytes 38.1 Mb
#> 2 4000048 bytes 3.8 Mb
#> 3 4048 bytes 4 Kb
#> 4 96 bytes 96 bytes
创建于2022-03-16由reprex包(v2.0.1(