将字符串函数传递给data.table时无法正确解析

时间:2014-11-13 17:07:10

标签: r data.table stringr

这里有点奇怪。我有一个文件根列表,我想从每个根提取终端文件名。一个丑陋的字符串函数组合通过检测最后一个" /"字符串中的字符,然后从后面提取。

现在奇怪的是,当单独应用于任何一个字符串时,该函数可以正常工作,但在传递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函数更快地运行?

提前致谢....

1 个答案:

答案 0 :(得分:0)

Arun的basename建议非常好用,例如

file_list[,file_name := basename(file_root)] 

找到奇怪的字符串结果的原因仍然很有趣,但这个解决方案适用于我的直接问题。

干杯