R中的订单列表元素

时间:2014-03-21 11:37:22

标签: r

我有一些像

这样的文件
myfiles <- c("1850-12.dat", "1851-10.dat", "1851-11.dat", "1851-1.dat",  "1851-6.dat", 
"1851-7.dat", "1851-8.dat",  "1852-10.dat", "1852-11.dat", "1852-12.dat",
"1852-1.dat",  "1852-2.dat",  "1852-3.dat",  "1852-4.dat",  "1852-7.dat", 
"1852-8.dat",  "1852-9.dat",  "1853-10.dat", "1853-11.dat", "1853-12.dat")

其中第一个数字是年份,第二个数字是月份,我将它们放在带有

的列表中
myfilesContent <- lapply(myfiles, read.table, quote="\"")

我用

重命名了每个元素的名称
myfilesContent <- setNames(myfilesContent,myfiles)
>myfilesContent[1]

$`1850-12.dat`
    V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16 V17 V18 V19 V20 V21
    .
    .
    .

我想要做的是根据年份和月份信息对列表元素重新排序。

我所做的是用一年中的天数重命名它们,因此每个列表元素的名称看起来像

> names(myfilesContent)
  [1] "335"   "639"   "670"   "366"   "517"   "547"   "578"   "1005"  "1036" 
 [10] "1066"  "731"   "762"   "791"   "822"   "913"   "944"   "975"   "1370" 
 [19] "1401"  "1431"  "1097"  "1128"  "1156"  "1187"  "1217"  "1248"  "1309" 
 [28] "1340"  "1735"  "1766"  "1796"  "1462"  "1493"  "1521"  "1552"  "1582" 

但后来我不知道如何对它们进行排序。

非常感谢

2 个答案:

答案 0 :(得分:4)

dates <- do.call(rbind, 
                 strsplit(gsub(".dat", "",
                               myfiles, fixed=TRUE), 
                          "-"))
dates <- matrix(as.numeric(dates), ncol=2)

myfilesContent[order(dates[,1], dates[,2])]

答案 1 :(得分:1)

您可以使用order(names(myfilesContent))找到排序所需的顺序,然后可以将其用于您想要的子集(我不清楚)。

这很有效,因为它可以对字符串进行排序。您可能遇到的唯一问题是字符串必须具有相同的长度(您需要追加0&#39; s。)

然后,您可以使用myfilesContent[order(names(myfilesContent)), ]进行排序,因为myfilesContent是一个矩阵

对于附加的0,您可以使用以下内容:

a = names(myfilesContent)
b = mapply(paste0,sapply(nchar(a),function(x) rep("0", max(char(x)) - x + 1)), a)

事实上,这比我最初认为的那样复杂[!],你应该考虑罗兰的回答,因为它解决了你处理约会的事实。

[!]我认为paste0(rep("0", max(nchar(a) - nchar(a)), a)会起作用。