这里有点奇怪。我有一个文件根列表,我想从每个根提取终端文件名。一个丑陋的字符串函数组合通过检测最后一个" /"字符串中的字符,然后从后面提取。
现在奇怪的是,当单独应用于任何一个字符串时,该函数可以正常工作,但在传递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
我可以把strsplit函数放在一起,它使用数据表中的sapply来完成这项工作,但实际上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函数更快地运行?
提前致谢....
答案 0 :(得分:0)
Arun的basename建议非常好用,例如
file_list[,file_name := basename(file_root)]
找到奇怪的字符串结果的原因仍然很有趣,但这个解决方案适用于我的直接问题。
干杯