我希望解析数据集并将其与我在R中已经制作的树匹配。我正在尝试简化提示标签以与我的系统发育树匹配。
例如来自“gi | 399148998 | gb | JN638572 |”并将其简化为“JN638572”(入藏号);我需要这样做61次(61个样本)。每个入藏号也从同一个位置开始。
## thanks for the data serban
set.seed(1)
mydat <- replicate(61, paste0(paste0(sample(letters,2), collapse=""),"|",
round(runif(1,1e8,1e9-1)),"|",
paste0(sample(letters,2), collapse=""),"|",
paste0(sample(LETTERS,2), collapse=""),
round(runif(1,1e6,1e7-1)),"|"))
head(mydat)
# [1] "gj|615568026|xf|XZ6947179|" "qb|285377117|er|JT5479293|" "sy|442031661|ux|FQ2129996|"
# [4] "gj|112051300|jv|IM6396092|" "me|844635986|rt|CS4701469|" "vq|804639485|on|UA5295070|"
答案 0 :(得分:2)
我建议你不要在R中使用for循环。 R可以执行整个矢量操作。对于您的特定实例,应该这样做:
library(stringr)
#Generate some data:
mydat <- replicate(61, paste0(paste0(sample(letters,2), collapse=""),"|",
round(runif(1,1e8,1e9-1)),"|",
paste0(sample(letters,2), collapse=""),"|",
paste0(sample(LETTERS,2), collapse=""),
round(runif(1,1e6,1e7-1)),"|"))
head(mydat)
[1] "pg|451576916|kj|FV9562908|" "dt|707843618|sj|KZ3658708|"
"lb|507989738|lc|ML2309736|" "nb|448725577|fo|DW1950100|"
[5] "iv|337265231|us|CR5163970|" "ew|254260770|rw|LB2404167|"
#Stuff you actually need:
results <- str_match(mydat, ".{2}\\|.*\\|.{2}\\|(.*)\\|")[,2]
#Results:
head(results)
[1] "FV9562908" "KZ3658708" "ML2309736" "DW1950100" "CR5163970" "LB2404167"
我正在使用正则表达式,它代表正则表达式。由于&#34;贪心&#34;它只适用".*\\|(.*)\\|"
。口译员,但我已经让它变得更加复杂,以便更容易解释.{Nr}
告诉它忽略Nr
个字符,而.*
告诉它忽略尽可能多的字符到达模式的下一部分,即\\|
。 |
是一个特殊字符,必须&#34;转义&#34;使用\\
,以便正则表达式处理器可以改为采用字面意思。括号是&#34;捕获组&#34;,即您想要返回的内容。
str_match
是stringr
库中的一个函数(您可能必须使用install.packages("stringr")
安装),如果找到匹配项,它会在第一列中返回整个模式,然后下一列将成为第一个捕获组。我只使用[,2]
表示法返回第二列。