1

特定の順序で処理する必要があるいくつかのデータファイルがあります。ファイル名のパターンは、例えば"Ad_10170_75_79.txt".

現在、それらは最初の数字 (長さが異なります) に従ってソートされています。以下を参照してください。

f <- as.matrix (list.files())
f
[1] "Ad_10170_75_79.txt" "Ad_10345_76_79.txt" "Ad_1049_25_79.txt"  "Ad_10531_77_79.txt"

しかし、次のように、それらを中央の数字でソートする必要があります。

> f
[1] "Ad_1049_25_79.txt" "Ad_10170_75_79.txt" "Ad_10345_76_79.txt"   "Ad_10531_77_79.txt"

ファイル名の真ん中の番号が必要なだけなので、残りの名前を削除してすべてのファイルの名前を変更するのが最も簡単な方法だと思いました。このために、strsplitplyr)を使用してみました。

f2 <- strsplit (f,"_79.txt")

しかし、すべてのファイルの名前を変更せずに、ファイルを直接並べ替える方法があると確信しています。sortand を使用して名前を説明しようとしましregexたが、成功しませんでした。これは何日もの間問題でした。私はこのおそらく簡単な作業を解決するために数時間をかけて検索し、試行しました。どんな助けでも大歓迎です。

古いサンプル データセット:

f <- c("Ad_10170_75_79.txt", "Ad_10345_76_79.txt",
       "Ad_1049_25_79.txt", "Ad_10531_77_79.txt")

ご回答ありがとうございます。数字に関係なく、考えられるすべての中間数に対して解決策が機能するはずなので、例を変更する必要があると思います。

新しいサンプル データセット:

f <- c("Ad_10170_75_79.txt", "Ad_10345_76_79.txt",
       "Ad_1049_9_79.txt", "Ad_10531_77_79.txt")
4

3 に答える 3

3

これが正規表現のアプローチです。

f[order(as.numeric(gsub('Ad_\\d+_(\\d+)_\\d+\\.txt', '\\1', f)))]
# [1] "Ad_1049_9_79.txt"   "Ad_10170_75_79.txt" "Ad_10345_76_79.txt" "Ad_10531_77_79.txt"
于 2013-07-08T12:23:23.493 に答える
2

これを試して:

f[order(as.numeric(unlist(lapply(strsplit(f, "_"), "[[", 3))))]
[1] "Ad_1049_25_79.txt"  "Ad_10170_75_79.txt" "Ad_10345_76_79.txt" "Ad_10531_77_79.txt"

最初に で分割し_、次にすべてのリスト要素の 3 番目の要素を選択し、順序とfその順序に基づくサブセットを見つけます。

于 2013-07-08T12:20:52.857 に答える
0

ファイル名とそれぞれの抽出されたインデックスを含む小さなデータフレームを作成します。

f<- c("Ad_10170_75_79.txt","Ad_10345_76_79.txt","Ad_1049_25_79.txt","Ad_10531_77_79.txt")
f2 <- strsplit (f,"_79.txt")
mydb <- as.data.frame(cbind(f,substr(f2,start=nchar(f2)-1,nchar(f2))))
names(mydb) <- c("filename","index")
library(plyr)
arrange(mydb,index)

この最初の列をファイル名ベクトルとして使用します。

補遺:

数値インデックスが必要な場合は、単純に文字を数値に変換します。

mydb$index <- as.numeric(mydb$index)
于 2013-07-08T12:24:26.343 に答える