gsub - trim 从单词末尾开始的 letters/numbers 序列
gsub - trim a sequence of letters/numbers from the end of a word
我有一个包含 900 个姓名的列表,例如:
- miR.30a.5p.11TC.0.0.0
- miR.30a.5p.0.G.0.ag
- miR.21.5p.0.A.0.tga
- miR.30a.3p.0.TA.c.c
我很想知道有多少 miR 在序列的最后一个点之前有“0”。我已经尝试了 grep 和 gsub 的不同组合(从最后一个点之后删除 letters/numbers )但是由于结尾之后的字母长度可变,我无法解决这个问题。我将非常感谢你的帮助。
预期输出是:
- 最后一个点前有0的miR数量(比如这个:miR.21.5p.0.A.0.tga,但不是这个:miR.30a.3p.0.TA.c.c).
- 或修剪最后一个点之后的所有内容
- miR.30a.5p.11TC.0.0
- miR.30a.5p.0.G.0
- 等等
来自 base R 的想法,
sum(sapply(x, function(i){i1 <- strsplit(i, '.', fixed = TRUE)[[1]];
i1[(length(i1)) - 1] == 0}))
#[1] 3
或使用stringr
包,
#For the sum,
sum(stringr::word(x, -2, sep = '\.') == 0)
#[1] 3
#For trimming
stringr::word(x, 1, -2, sep = '\.')
#[1] "miR.30a.5p.11TC.0.0" "miR.30a.5p.0.G.0" "miR.21.5p.0.A.0" "miR.30a.3p.0.TA.c"
数据
x <- c('miR.30a.5p.11TC.0.0.0',
'miR.30a.5p.0.G.0.ag',
'miR.21.5p.0.A.0.tga',
'miR.30a.3p.0.TA.c.c')
sum(gsub('.*\.(.*)\..*','\1',x)==0)
[1] 3
.*
任意数量的字符,也可以包含点
\.
一个字面的点
(.*)
一组任意数量的字符。我们将使用 \1
恢复这个组
\..*
一个文字点 "the final dot" 后跟任意数量的字符
示例数据
names <- c("miR.30a.5p.11TC.0.0.0",
"miR.30a.5p.0.G.0.ag",
"miR.21.5p.0.A.0.tga",
"miR.30a.3p.0.TA.c.c",
"miR.30a.5p.11TC.0.0",
"miR.30a.5p.0.G.0")
工作流程
- 按“.”拆分字符串
- 反向分割向量
- 取第二个元素
filt <- unlist(lapply(lapply(strsplit(names, ".", fixed=T), rev), "[[", 2)) == "0" # boolean vector with TRUE where
sum(filt) # nb of files with zeros as second last element
最好的,
克里斯
我有一个包含 900 个姓名的列表,例如:
- miR.30a.5p.11TC.0.0.0
- miR.30a.5p.0.G.0.ag
- miR.21.5p.0.A.0.tga
- miR.30a.3p.0.TA.c.c
我很想知道有多少 miR 在序列的最后一个点之前有“0”。我已经尝试了 grep 和 gsub 的不同组合(从最后一个点之后删除 letters/numbers )但是由于结尾之后的字母长度可变,我无法解决这个问题。我将非常感谢你的帮助。
预期输出是:
- 最后一个点前有0的miR数量(比如这个:miR.21.5p.0.A.0.tga,但不是这个:miR.30a.3p.0.TA.c.c).
- 或修剪最后一个点之后的所有内容
- miR.30a.5p.11TC.0.0
- miR.30a.5p.0.G.0
- 等等
来自 base R 的想法,
sum(sapply(x, function(i){i1 <- strsplit(i, '.', fixed = TRUE)[[1]];
i1[(length(i1)) - 1] == 0}))
#[1] 3
或使用stringr
包,
#For the sum,
sum(stringr::word(x, -2, sep = '\.') == 0)
#[1] 3
#For trimming
stringr::word(x, 1, -2, sep = '\.')
#[1] "miR.30a.5p.11TC.0.0" "miR.30a.5p.0.G.0" "miR.21.5p.0.A.0" "miR.30a.3p.0.TA.c"
数据
x <- c('miR.30a.5p.11TC.0.0.0',
'miR.30a.5p.0.G.0.ag',
'miR.21.5p.0.A.0.tga',
'miR.30a.3p.0.TA.c.c')
sum(gsub('.*\.(.*)\..*','\1',x)==0)
[1] 3
.*
任意数量的字符,也可以包含点
\.
一个字面的点
(.*)
一组任意数量的字符。我们将使用 \1
恢复这个组
\..*
一个文字点 "the final dot" 后跟任意数量的字符
示例数据
names <- c("miR.30a.5p.11TC.0.0.0",
"miR.30a.5p.0.G.0.ag",
"miR.21.5p.0.A.0.tga",
"miR.30a.3p.0.TA.c.c",
"miR.30a.5p.11TC.0.0",
"miR.30a.5p.0.G.0")
工作流程
- 按“.”拆分字符串
- 反向分割向量
- 取第二个元素
filt <- unlist(lapply(lapply(strsplit(names, ".", fixed=T), rev), "[[", 2)) == "0" # boolean vector with TRUE where
sum(filt) # nb of files with zeros as second last element
最好的, 克里斯