0

ここで少し奇妙なものです。ファイル ルートのリストがあり、各ルートからターミナル ファイル名を抽出したいと考えています。ストリンガー関数の見苦しい複合は、文字列の最後の「/」文字を検出し、後ろから抽出することで仕事をします。

ここで奇妙なことに、関数は任意の 1 つの文字列に個別に適用すると正常に動作しますが、data.table に渡されると適切に適用されないようです。

require(data.table)
require(stringr)

file_list <- data.table(file_root = c("~/dat/stuff/thing.csv",
                                      "~/dat/stuff/thingy.csv",
                                      "~/dat/otherstuff/thinger.csv"))

file_root <- "~/dat/otherstuff/thinger.csv"

success <- str_sub(file_root,-(str_length(file_root) - max(str_locate_all(file_root,"/")[[1]])),-1) 

#> success
#[1] "thinger.csv"

file_list[, extract := str_sub(file_root,-(str_length(file_root) - max(str_locate_all(file_root,"/")[[1]])),-1)]

#> head(file_list)
#file_root          extract
#1:        ~/dat/stuff/thing.csv        thing.csv
#2:       ~/dat/stuff/thingy.csv       thingy.csv
#3: ~/dat/otherstuff/thinger.csv tuff/thinger.csv Final result is incorrect

sapply を使用してデータ テーブルを処理する strsplit 関数をまとめることができますが、実際には、file_list は数十万行の長さになり、sapply には非常に長い時間がかかります。

find_name <- function(X) {as.character(data.table(strsplit(X,"/")[[1]])[NROW(data.table(strsplit(X,"/")[[1]]))])}

file_list[,extract := sapply(file_root,find_name)]

だから私の質問はです。元の機能が機能しない理由と、それを修正する方法はありますか? あるいは、find_name 関数をより速く動作させるにはどうすればよいですか?

前もって感謝します....

4

1 に答える 1

0

Arun によるベース名の提案は非常にうまく機能します。

file_list[,file_name := basename(file_root)] 

奇妙なストリンガーの結果の理由を見つけることはまだ興味深いでしょうが、この解決策は私の差し迫った問題に有効です.

乾杯

于 2014-11-13T17:52:13.027 に答える