如何在列表中订购文件。

时间:2016-08-30 15:34:41

标签: r

我有一个包含一些元素的列表。

 $y
  [1] "/data/y_11_au_fg.txt"
  [2] "/data/y_11_sp_fg.txt"
  [3] "/data/y_11_su_fg.txt"
  [4] "/data/y_11_wi_fg.txt"
  [5] "/data/y_12_au_fg.txt"
  [6] "/data/y_12_sp_fg.txt"
  [7] "/data/y_12_su_fg.txt"
  [8] "/data/y_12_wi_fg.txt"

这些文件是根据11 and 12编号排序的,但是我还需要特定的订单au then wi then sp then su

需要最终输出:

  $y
    [1] "/data/y_11_au_fg.txt"
    [2] "/data/y_11_wi_fg.txt"
    [3] "/data/y_11_sp_fg.txt"
    [4] "/data/y_11_su_fg.txt"
    [5] "/data/y_12_au_fg.txt"
    [6] "/data/y_12_wi_fg.txt"
    [7] "/data/y_12_sp_fg.txt"
    [8] "/data/y_12_su_fg.txt"

1 个答案:

答案 0 :(得分:1)

由于这是自定义order,我们会遍历list元素(lapply(lst, ..),使用gsub提取数字部分,转换为numeric ('v1'),类似地只提取具有'au / wi / sp / su'('v2')的子串部分,将其转换为factor类,其中levels类按照中描述的顺序指定OP的帖子,然后我们order向量'v1','v3'并使用该数字索引来排序原始向量('x')。

 lapply(lst, function(x) {v1 <- as.numeric(gsub("\\D+", "", x))
                           v2 <- gsub(".*\\d+_|_.*", "", x)
                           v3 <- factor(v2, levels = c("au", "wi", "sp", "su"))

                           x[order(v1, v3)]
                           })
#$y
#[1] "/data/y_11_au_fg.txt"
#[2] "/data/y_11_wi_fg.txt"
#[3] "/data/y_11_sp_fg.txt"
#[4] "/data/y_11_su_fg.txt"
#[5] "/data/y_12_au_fg.txt" 
#[6] "/data/y_12_wi_fg.txt"
#[7]  "/data/y_12_sp_fg.txt"
#[8] "/data/y_12_su_fg.txt"

数据

lst <- structure(list(y = c("/data/y_11_au_fg.txt", "/data/y_11_sp_fg.txt", 
 "/data/y_11_su_fg.txt", "/data/y_11_wi_fg.txt", "/data/y_12_au_fg.txt", 
"/data/y_12_sp_fg.txt", "/data/y_12_su_fg.txt", "/data/y_12_wi_fg.txt"
)), .Names = "y")