在向量或R中的数据帧中按大小和单位面额对对象进行排序



我正在尝试按降序对对象大小的向量进行排序,并创建一个数据帧。我在排序时遇到了一个问题,因为数字有单位面额(例如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(

最新更新