2016-12-15 4 views
-3
例えば

のストリングでR内のすべての行名を交換し、私が持っている:AO-A12D.01TCGA 私は、行名は唯一の「A12D」これらの名前

私も列名の別の種類を持っているから成りたいですしかし今回は順序が違う: TCGA-A2-A0T2 私はA0T2に置き換えたい。ここでは4文字が最後に見つかっていますが、最初の場合は中間にあります。

どうすればいいですか?

編集:最初のケースでは、区切り記号はに基づいています。 - 4文字は常にそれらの間にあるので 2番目の場合、4文字は最後の4文字であり、区切り文字はありません。

+0

サンプルデータを 'dput()'してください。この例の背後にある論理についても説明してください。それはちょうど '-'と' .'の位置に基づいていますか? –

+0

rownameの残りの部分と区別したい文字列を定義するものは何ですか?それは常に4文字ですか?与えられたrownameに4文字もの長さの他の部分文字列があるかもしれませんか? '-'と' .'は唯一の区切り文字ですか?最初のケースでは – rosscova

+0

は - と - に基づいています。 2番目のケースでは、最後の4文字を取る必要があります –

答えて

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 

あなたが上でそれらを呼び出す場合は、これらの正規表現のどちらも間違った文字列型のサブセット化によって、誤ったエラーを生成します同じデータセット。

+0

申し訳ありませんが、AO.A12D.01TCGAと同じパターンがあります。また、A12Dを抽出したいのですが、どうすればよいですか?それは2つで区切られています。私は本当に正規表現に堪えません...あなたのコードは、私が質問で言及したケースで完璧に動作します! –

+0

@ shadow.T私の答えをチェックし、それが動作するかどうかを確認します。 – useR

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 
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を入力として受け取り、に一致するのリストを返します。 lookbehindとlookaheadはperlでしか動作しないので、perl = TRUEが必要であることに注意してください。あなたは第三のケースを述べたコメントであるため、@ griffmerの答えの下

、私はちょうど少し私の正規表現を変更することでこれを行う方法を紹介します:あなたの4文字のコードがいずれかに従うことができる。ここ

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" 

-または.で指定します。だから、lookbhindのドットを追加してください(?<=[-.])。しかし、この3番目のケースでは、rownames[1]rownames[3]の "01TC"も一致します。これは私たちが望むものではありません。 単語境界を意味する\\bを追加すると、 "A12D"、 "A0T2"、 "A12D"が続き、 "G"が後に続くため、 "01TC"は一致しません。

関連する問題