将R中的所有行名替换为这些名称的子字符串

时间:2016-12-15 04:32:43

标签: r

例如,我有:AO-A12D.01TCGA 我希望行名只包含" A12D"

我还有另一种行名,但这次订单不同: TCGA-A2-A0T2 我希望它被A0T2取代。这里最后找到4个字符,而在第一种情况下它们位于中间。

我该怎么做?

编辑:在第一种情况下,分隔符基于。并且 - 因为它们之间总共有4个字符 在第二种情况下,4个字符只是最后4个字符,没有分隔符

3 个答案:

答案 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个字母数字的位置。 regmatchesgregexpr作为输入,仅返回匹配的列表。请注意,您需要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”会。