ここで少し奇妙なものです。ファイル ルートのリストがあり、各ルートからターミナル ファイル名を抽出したいと考えています。ストリンガー関数の見苦しい複合は、文字列の最後の「/」文字を検出し、後ろから抽出することで仕事をします。
ここで奇妙なことに、関数は任意の 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 関数をより速く動作させるにはどうすればよいですか?
前もって感謝します....