首页 > 解决方案 > 对 R 中的文件名向量进行排序,因为 Windows 会对它们进行排序?

问题描述

我想对R中的文件名向量进行排序,就像Windows在按名称排序时对它们进行排序一样(右键单击->按->名称排序)。

假设我有四个 jpg 文件(我有更多)。Windows,当按名称排序时,按我在下面写的顺序对它们进行排序:

283_20200110_230606.jpg 500_20191203_032950.jpg 10889_20200114_165958.jpg 314368230_20200116_140854.jpg

R 使用时list.files(),会像这样对它们进行排序: "10889_20200114_165958.jpg" "283_20200110_230606.jpg" "314368230_20200116_140854.jpg" "500_20191203_032950.jpg"

似乎在 Rcharacter中,数字 1 始终排在第一位,而 Windows 比较第一个下划线之前的数字。

有没有办法让它们以相同的方式排序?是像 Windows 那样在 R 中排序,还是像 R 那样在 Windows 中排序?

编辑:

测试数据:

v1 <- c("10889_20200114_165958.jpg", "283_20200110_230606.jpg", "314368230_20200116_140854.jpg", "500_20191203_032950.jpg")

标签: rsortingcharacter

解决方案


正则表达式将提取文件名向量中中断[0-9]{1,}之前的任意数量的数字 0-9 。_转换为数字,排序为您提供所需的顺序。

library(tidyverse)

f <- c("283_20200110_230606.jpg", "314368230_20200116_140854.jpg", 
       "500_20191203_032950.jpg", "10889_20200114_165958.jpg")

tibble(f) %>% 
  mutate(prefix = as.numeric(str_extract(f, "[0-9]{1,}"))) %>% 
  arrange(prefix) %>% 
  pull(f)

[1] "283_20200110_230606.jpg"      
[2] "500_20191203_032950.jpg"      
[3] "10889_20200114_165958.jpg"    
[4] "314368230_20200116_140854.jpg"

推荐阅读