2

gsubの使用について質問があります。私のデータの行名は、同じ部分的な名前を持っています。下記参照:

> rownames(test)
[1] "U2OS.EV.2.7.9"   "U2OS.PIM.2.7.9"  "U2OS.WDR.2.7.9"  "U2OS.MYC.2.7.9"
[5] "U2OS.OBX.2.7.9"  "U2OS.EV.18.6.9"  "U2O2.PIM.18.6.9" "U2OS.WDR.18.6.9"
[9] "U2OS.MYC.18.6.9" "U2OS.OBX.18.6.9" "X1.U2OS...OBX"   "X2.U2OS...MYC"
[13] "X3.U2OS...WDR82" "X4.U2OS...PIM"   "X5.U2OS...EV"    "exp1.U2OS.EV"
[17] "exp1.U2OS.MYC"   "EXP1.U20S..PIM1" "EXP1.U2OS.WDR82" "EXP1.U20S.OBX"
[21] "EXP2.U2OS.EV"    "EXP2.U2OS.MYC"   "EXP2.U2OS.PIM1"  "EXP2.U2OS.WDR82"
[25] "EXP2.U2OS.OBX"

前の質問で、同じ部分名に対して同じ名前を取得する方法があるかどうかを尋ねました。この質問を参照してください:データフレームの行名をサブ文字列に置き換える

答えは非常に良い解決策です。関数gsubは次のように使用されます。

 transfecties = gsub(".*(MYC|EV|PIM|WDR|OBX).*", "\\1", rownames(test)

今、私は別の問題を抱えています、私がR(ギャラクシー)で実行するプログラムは|を認識しません 文字。私の質問は、これを使用せずに同じ解決策に到達する別の方法はありますか?

ありがとう!

4

2 に答える 2

2

「|」を使用したくない場合 文字、次のようなものを試すことができます:

Rnames <-
c( "U2OS.EV.2.7.9",   "U2OS.PIM.2.7.9",  "U2OS.WDR.2.7.9",  "U2OS.MYC.2.7.9" ,
 "U2OS.OBX.2.7.9" , "U2OS.EV.18.6.9"  ,"U2O2.PIM.18.6.9" ,"U2OS.WDR.18.6.9"  )

Rlevels <- c("MYC","EV","PIM","WDR","OBX")    
tmp <- sapply(Rlevels,grepl,Rnames)
apply(tmp,1,function(i)colnames(tmp)[i])
[1] "EV"  "PIM" "WDR" "MYC" "OBX" "EV"  "PIM" "WDR"

しかし、ORの記号を使用できないのはかなり厄介なように見えるので、これを銀河のチームに言及することを真剣に検討します...

于 2011-06-09T11:06:17.777 に答える
2

@csgillespieが提供するソリューションよりもはるかに効率が悪いため、一般的にRでこれを行うことはお勧めしませが、代わりに、一致させたいさまざまな文字列をループし、各文字列で個別に置換を行うことです。一致する行名のみを置換します。"MYN""MYN"

x@csgilespie のAnswerからのデータを使用した例を次に示します。

x <-  c("U2OS.EV.2.7.9", "U2OS.PIM.2.7.9", "U2OS.WDR.2.7.9", "U2OS.MYC.2.7.9",
       "U2OS.OBX.2.7.9", "U2OS.EV.18.6.9", "U2O2.PIM.18.6.9","U2OS.WDR.18.6.9",
       "U2OS.MYC.18.6.9","U2OS.OBX.18.6.9", "X1.U2OS...OBX","X2.U2OS...MYC")

データをコピーして、後で比較できるようにします (これは単なる例です)。

x2 <- x

次に、一致させたい文字列のリストを作成します。

matches <- c("MYC","EV","PIM","WDR","OBX")

次に、値をループして、次のmatches3 つのことを行います (##Xコード内で番号が付けられています)。

  1. i現在の一致文字列を、使用したい正規表現の他のビットと一緒に貼り付けて、正規表現を作成します。
  2. を使用して、文字列を含むgrepl()要素の論理インジケーターを返しますx2i
  3. gsub()次に、既に示したのと同じスタイル呼び出しを使用しますがx2、文字列に一致した要素のみを使用し、それらの要素のみを置き換えます。

ループは次のとおりです。

for(i in matches) {
    rgexp <- paste(".*(", i, ").*", sep = "") ## 1
    ind <- grepl(rgexp, x)                    ## 2
    x2[ind] <- gsub(rgexp, "\\1", x2[ind])    ## 3
}
x2

これにより、次のことが得られます。

> x2
 [1] "EV"  "PIM" "WDR" "MYC" "OBX" "EV"  "PIM" "WDR" "MYC" "OBX" "OBX" "MYC"
于 2011-06-09T11:06:48.613 に答える