1

次のパターンの部分文字列のリストがあります。

my.list <- list("file1\\subfile1-D.ext", "file12\\subfile9-D.ext", "file2\\subfile113-D.ext")

等々。ファイル番号とサブファイル番号を、ファイル/サブファイル番号を含む数値データフレームに抽出したいと思います。これまで、私は次のアプローチを使用してきました。

extract.file <- function(file.name){
  file.name <- sub("file", "", file.name)
  file.name <- sub("\\\\*subfile.*", "", file.name)
}

extract.subfile <- function(subfile.name){
  subfile.name <- sub("file.*subfile", "", subfile.name)
  subfile.name <- sub("-D.ext", "", subfile.name)
}

name.file <- lapply(my.list, extract.file)
name.file <- as.numeric(unlist(name.file))
name.subfile <- lapply(my.list, extract.subfile)
name.subfile <- as.numeric(unlist(name.subfile))

my.df <- data.frame(file=name.file, subfile=name.subfile)

substring.locationまた、最初にライブラリから文字列の場所を抽出しstringr(これにより、開始値と終了値を持つ別のリストが生成されます)、次に2つのリストをループすることも試しましたが、これも複雑になりすぎます。目標を達成するためのより良い方法はありますか?

4

2 に答える 2

5

いくつかの代替案:
[編集: strsplit は配列を取り、リストを返すことができ、rbind 呼び出し内で適用をネストする場合と比較して、約半分の時間を節約できます。]

my.df <- do.call( rbind, strsplit( unlist(my.list), split="(\\\\|-D.ext)" ) )
my.df <- data.frame( my.df )
names( my.df ) <- c("file", "subfile")

また

my.df <- do.call( rbind, strsplit( unlist(my.list), split="[^[:alnum:]]" ) )[, 1:2]
my.df <- data.frame( my.df )
names( my.df ) <- c("file", "subfile")

この方法で行うことの 1 つは、すべての入力が元のmy.listサンプルに従っている場合、かなり価値のない冗長なデータが残ることです。

おそらく、より良い解決策は次のとおりです。

# Not sure why strsplit() returns an empty string on the first non-digit match,
# but it does and we account for it by dropping the first returned column.
my.list <- unlist( my.list )
my.df <- do.call( rbind, strsplit( my.list, split="[^[:digit:]]+" ) )[,-1]
my.df <- data.frame( my.list, my.df )
names( my.df ) <- c( "orig", "file", "subfile" )

重複することなく、かなりの量のメモリ/ストレージを節約でき、テキスト/文字の順序/表現に煩わされることなく物事を操作できるようになりました。


?strsplit、 、?regex、および?grep一致するものを確認してください。

data.frame のセットアップは非常に簡単です... strsplit はベクトルを取り、リストを返しますが、do.call はリストをバインドする必要があります。

于 2012-08-13T17:28:01.277 に答える
2

これは、あなたが求めていることを実行しているように見える後方参照を持つ正規表現です:

sapply(my.list, function(x)gsub(".*\\\\(.*)-D\\.ext", "\\1", x))
[1] "subfile1"   "subfile9"   "subfile113"

"\\1"、括弧内の文字列の値を返す後方参照です。

于 2012-08-13T14:59:22.320 に答える