从向量中提取唯一的部分元素

时间:2014-09-10 13:27:42

标签: r

我需要从下面文件夹的内容中列出唯一主题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点更清洁的方式?

2 个答案:

答案 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()中包含模式是必需的。