Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用这些名称的子字符串替换R中的所有行名称_R - Fatal编程技术网

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

用这些名称的子字符串替换R中的所有行名称,r,R,例如,我有:AO-A12D.01TCGA 我希望行名称仅由12D组成 我还有另一种行名称,但这次的顺序不同: TCGA-A2-A0T2 我希望它被A0T2取代。这里,4个字符在结尾,而在第一种情况下,它们在中间。 我怎么做 编辑:在第一种情况下,分隔符基于。和-因为4个字符总是在它们之间 在第二种情况下,4个字符只是最后4个字符,没有分隔符需要可复制的示例 可能您正在寻找以下内容: #string AO-A12D.01TCGA --> A12D row.names(x)<-gsub(

例如,我有:AO-A12D.01TCGA 我希望行名称仅由12D组成

我还有另一种行名称,但这次的顺序不同: TCGA-A2-A0T2 我希望它被A0T2取代。这里,4个字符在结尾,而在第一种情况下,它们在中间。

我怎么做

编辑:在第一种情况下,分隔符基于。和-因为4个字符总是在它们之间
在第二种情况下,4个字符只是最后4个字符,没有分隔符需要可复制的示例

可能您正在寻找以下内容:

#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

顺便说一句,根据我的测试,如果在同一个数据集上调用这些正则表达式,它们都不会通过对错误的字符串类型进行子集设置而产生错误。

下面是我如何解决的,但在给出可复制的样本之前,我们只能猜测:

按原样获取行名,按字符-和分割,然后删除第一个子字符串,因为您永远不需要字符串的第一部分,然后仅获取剩余的字符长度为4的字符串:

library( magrittr )
new.rownames <- rownames( x ) %>%
  strsplit( "-|[.]" ) %>%
  lapply( function(x) x[ -1 ] ) %>%
  sapply( function(x) x[ nchar( x ) == 4 ] )
然后将这些新名称应用于原始数据

rownames(x) <- new.rownames
如果只有这两种格式,则可以使用正向查找和正则匹配来获取所需的内容:

rownames = c("AO-A12D.01TCGA", "TCGA-A2-A0T2")
unlist(regmatches(rownames, gregexpr("(?<=-)[[:alnum:]]{4}", rownames, perl = TRUE)))

[1] "A12D" "A0T2"

在这里,4个字符的代码后面可以跟-或。。所以,只需在“查找”中添加点即可。请输入您的示例数据。还请解释示例背后的逻辑。它仅仅是基于-和的位置吗?是什么定义了您想要的字符串与行名的其余部分不同?它总是4个字符长吗?在给定的行名中可能还有其他4个字符长的子字符串吗?是和。唯一的分隔符?在第一种情况下,它基于-和。在第二种情况下,我只需要最后4个字符在第二种情况下,有2个字符串,4个字符长,那么我们应该如何决定使用A0T2而不是TCGA?我在问题中说,在第二种情况下,我们只需要最后4个字符,但我也有一个与AO.A12D.01TCGA相同的模式,我还想提取A12D,我应该换什么?它由两个分隔。我真的不擅长正则表达式。。。您的代码在我在问题中提到的情况下非常有效!
rownames = c("AO-A12D.01TCGA", "TCGA-A2-A0T2")
unlist(regmatches(rownames, gregexpr("(?<=-)[[:alnum:]]{4}", rownames, perl = TRUE)))

[1] "A12D" "A0T2"
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"