例如,我有:AO-A12D.01TCGA 我希望行名只包含" A12D"
我还有另一种行名,但这次订单不同: TCGA-A2-A0T2 我希望它被A0T2取代。这里最后找到4个字符,而在第一种情况下它们位于中间。
我该怎么做?
编辑:在第一种情况下,分隔符基于。并且 - 因为它们之间总共有4个字符 在第二种情况下,4个字符只是最后4个字符,没有分隔符
答案 0 :(得分:0)
需要一个可重复的例子。
可能你正在寻找类似的东西:
#string AO-A12D.01TCGA --> A12D
row.names(x)<-gsub(".*-(.*)[.].*", "\\1", row.names(x)) #where x has values like "AO-A12D.01TCGA"
#string TCGA-A2-A0T2 --> TCGA-A2-A0T2
row.names(x)<-gsub(".*-.*-(.*)", "\\1", row.names(x)) #where x has values like "TCGA-A2-A0T2"
#row.names gets row names of data frame
#gsub defines a regular expression/pattern, where:
#gsub("pattern", "stuff to replace pattern with", data)
#in regular expression language:
#.* = anything
#[.] = a literal "dot"
#(string) = part of pattern you want to keep
#\\1 means keep only the stuff in parentheses
顺便说一下,根据我的测试,如果你在相同的数据集上调用错误的字符串类型,这些正则表达式都不会产生错误的错误。
答案 1 :(得分:0)
以下是我如何解决这个问题,但在你提供可重复的样本之前,我们实际上做的不仅仅是推测:
按原样rownames
,按字符-
和.
分割,然后删除第一个子字符串(纯粹猜测你永远不需要第一部分字符串),然后只获取字符长度为4的其余字符串:
library( magrittr )
new.rownames <- rownames( x ) %>%
strsplit( "-|[.]" ) %>%
lapply( function(x) x[ -1 ] ) %>%
sapply( function(x) x[ nchar( x ) == 4 ] )
返回(对于你给出的3个例子):
> new.rownames
[1] "A12D" "A0T2" "A12D"
然后将这些新名称应用于原始数据。
rownames(x) <- new.rownames
答案 2 :(得分:0)
如果这些是仅两种格式,您可以使用肯定的后视和regmatches
来获得您想要的内容:
rownames = c("AO-A12D.01TCGA", "TCGA-A2-A0T2")
unlist(regmatches(rownames, gregexpr("(?<=-)[[:alnum:]]{4}", rownames, perl = TRUE)))
[1] "A12D" "A0T2"
(?<=-)
是一个积极的外观部分,您希望gregexpr
仅向您提供位于-
符号后面的4个字母数字的位置。 regmatches
将gregexpr
作为输入,仅返回匹配的列表。请注意,您需要perl = TRUE
,因为lookbehinds和lookaheads仅适用于perl。
因为在@ griffmer的回答中您提到了第三个案例,我将通过稍微修改我的正则表达式来演示如何做到这一点:
rownames = c("AO-A12D.01TCGA", "TCGA-A2-A0T2", "AO.A12D.01TCGA")
unlist(regmatches(rownames, gregexpr("(?<=[-.])[[:alnum:]]{4}\\b", rownames, perl = TRUE)))
[1] "A12D" "A0T2" "A12D"
在这里,您的4个字符代码可以跟-
或.
。所以只需在lookbehind (?<=[-.])
中添加点。然而,在第三种情况下,rownames[1]
和rownames[3]
中的“01TC”也会匹配,这不是我们想要的。通过添加代表字边界的\\b
,两种情况下的“01TC”将不匹配,因为它后跟“G”,而“A12D”,“A0T2”和“A12D”会。