6

400列のタブdelimファイルがあります。列名にテキストを追加したい.つまり、列名がAとBの場合、AをA.ovcaに、BをB.ctrls.Likeに変更したいテキスト (ovca および ctrls) を 400 個の列に追加したいと考えています。いくつかの列名には ovca が含まれ、いくつかには ctrls が含まれています。すべての列は一意であり、1000 行を超える行が含まれています。delim ファイルのサンプル コードを以下に示します。

         X             Y         Z               A       B               C  
        2.34          .89       1.4             .92     9.40            .82
        6.45          .04       2.55            .14     1.55            .04
        1.09          .91       4.19            .16     3.19            .56
        5.87          .70       3.47            .80     2.47            .90

そして、ファイルを次のようにしたい:

       X.ovca     Y.ctrls      Z.ctrls       A.ovca     B.ctlrs       C.ovca  
        2.34          .89       1.4             .92     9.40            .82
        6.45          .04       2.55            .14     1.55            .04
        1.09          .91       4.19            .16     3.19            .56
        5.87          .70       3.47            .80     2.47            .90

私を助けてください

よろしくティリーパン

4

3 に答える 3

6

data.frame が呼び出されdatた場合、 で列名にアクセス (および書き込み) できますcolnames(dat)

したがって:

cn <- colnames(dat)
cn <- sub("([AXC])","\\1.ovca",cn)
cn <- sub("([YZB])","\\1.ctrls",cn)
colnames(dat) <- cn

> cn
[1] "X.ovca"  "Y.ctrls" "Z.ctrls" "A.ovca"  "B.ctrls" "C.ovca" 

これ\\1は、正規表現内で後方置換と呼ばれます。\\1パターンの括弧内にあるものに置き換えられます。括弧の中に括弧があるので、それは中のどの文字にもマッチします。この場合、「A」は「A.ovca」、「X」は「X.ovca」になります。

変数名が複数の文字である場合、簡単に拡張できます。正規表現を少し調べてください。

于 2011-11-06T16:20:31.970 に答える
5

stringrこれは、パッケージを使用した 2 つのライナーです。

nam <- names(mydf)
names(mydf) <- ifelse(nam %in% c('X', 'A', 'Z'), 
   str_c(nam, '.ovca'),  str_c(nam, '.ctrls'))
于 2011-11-06T20:39:13.050 に答える
3

これはどう?基本的に、 を使用して「ovca」と「ctrls」を追加する列を見つけ%in%、適切なタグを追加します。

> (mydf <- data.frame(X = runif(10), Y = runif(10), Z = runif(10), A = runif(10), B = runif(10), C = runif(10)))
            X         Y         Z         A         B         C
1  0.81030594 0.1624974 0.3977381 0.9619541 0.9866498 0.4424760
2  0.92498687 0.2069429 0.6065115 0.9969835 0.2407364 0.2455184
3  0.11033869 0.2878640 0.5662793 0.7936232 0.6066735 0.8210634

> names(mydf)[names(mydf) %in% c("X", "A", "C")] <- paste(names(mydf)[names(mydf) %in% c("X", "A", "C")], "ovca", sep = ".")
> names(mydf)[names(mydf) %in% c("Y", "Z", "B")] <- paste(names(mydf)[names(mydf) %in% c("Y", "Z", "B")], "ctrls", sep = ".")
> mydf
       X.ovca   Y.ctrls   Z.ctrls    A.ovca   B.ctrls    C.ovca
1  0.81030594 0.1624974 0.3977381 0.9619541 0.9866498 0.4424760
2  0.92498687 0.2069429 0.6065115 0.9969835 0.2407364 0.2455184
3  0.11033869 0.2878640 0.5662793 0.7936232 0.6066735 0.8210634
于 2011-11-06T16:29:31.887 に答える