我需要从下面文件夹的内容中列出唯一主题ID(_之前和之后的部分)。
[1] "." "./4101_0" "./4101_0/4101 Baseline"
[4] "./4101_1" "./4101_2" "./4101_2_2"
[7] "./4101_3" "./4101_4" "./4101_5"
[10] "./4101_6"
现在我正在这样做(使用包stringr和foreach)。
# Create list of contents
Folder.list <- list.dirs()
# Split entries by the "/"
SubIDs <- str_split(Folder.list, "/")
# For each entry in the list, retrieve the second element
SubIDs <- unlist(foreach(i=1:length(SubIDs)) %do% SubIDs[[i]][2])
# Split entries by the "_"
SubIDs <- str_split(SubIDs, "_")
# Take the second element after splitting, unlist it, find the unique entries, remove the NA and coerce to numeric
SubIDs <- as.numeric(na.omit(unique(unlist(foreach(i=1:length(SubIDs)) %do% SubIDs[[i]][1]))))
这可以完成这项工作,但似乎不必要地太可怕了。什么是从A点到B点更清洁的方式?
答案 0 :(得分:1)
使用q正则表达式。
x <- c(".", "./4101_0", "./4101_0/4101 Baseline", "./4101_1", "./4101_2", "./4101_2_2", "./4101_3", "./4101_4", "./4101_5", "./4101_6")
使用正则表达式的一种方法是使用gsub()
来提取主题代码
gsub(".*/(\\d+)_.*", "\\1", x)
[1] "." "4101" "4101" "4101" "4101" "4101" "4101" "4101" "4101" "4101"
答案 1 :(得分:1)
stringr
还具有str_extract
函数,可用于提取与正则表达式模式匹配的子字符串。 /
具有正面的背后隐藏,_
具有积极的前瞻性,您可以实现自己的目标。
从@ Andrie&#39; x
开始:
str_extract(x, perl('(?<=/)\\d+(?=_)'))
# [1] NA "4101" "4101" "4101" "4101" "4101" "4101" "4101" "4101" "4101"
上面的模式匹配一个或多个数字(即\\d+
),前面有正斜杠,后跟下划线。在perl()
中包含模式是必需的。