この関数を呼び出して、入力データフレームに対してこの関数を実行するとnewBamAD
、次のようになりますoutput
(以下を参照)mydf
。newBamAD(mydf)
列名bam.ADを新しい列名に変更して結果を保存したい。たとえばbam.AD
、次のようなデータフレームで関数を実行するときに、同じ手順で列名を新しい名前に変更したいとしますoutput<-newBamAD(mydf)
。
output
start REF ALT bam.AD
1 "chr20:5363934" "C" "T" "59,29"
2 "chr5:8529759" "G" "C" "28,41"
3 "chr14:9620689" "T" "G" "49,41"
こんな感じにしたい
output
start REF ALT newname.AD
1 "chr20:5363934" "C" "T" "59,29"
2 "chr5:8529759" "G" "C" "28,41"
3 "chr14:9620689" "T" "G" "49,41"
マトリックスまたはdata.frameのどちらがあるかが重要です。行列はdimnames
属性を使用して行名と列名を格納し、data.framesは属性names
とrow.names
属性を使用してそれぞれ列名と行名を格納します。
あなたの質問から、あなたはそこに行列があるように見えます。output
なぜなら、data.framesは通常、印刷時に文字要素を引用しませんが(実際に因子であるか真の文字ベクトルであるかに関係なく)、行列は引用します。
したがって、列名を変更するには、colnames<-()
関数を使用する必要があります。(代わりにこのdimnames<-()
関数を使用することもできますが、行名用と列名用の2つのコンポーネントを持つリストRHSが必要になります。行名をいじりたくないので、役に立ちません。)
関数呼び出しと同じ行でこれを実行する場合は、colnames<-()
バックティックを使用して呼び出して、<-
トークンをパーサーから保護する必要があります。したがって、次のようになります。
mydf <- data.frame(); ## dummy
newBamAD <- function(mydf) matrix(c('chr20:5363934','chr5:8529759','chr14:9620689','C','G','T','T','C','G','59,29','28,41','49,41'),3,dimnames=list(1:3,c('start','REF','ALT','bam.AD')));
newBamAD(mydf);
## start REF ALT bam.AD
## 1 "chr20:5363934" "C" "T" "59,29"
## 2 "chr5:8529759" "G" "C" "28,41"
## 3 "chr14:9620689" "T" "G" "49,41"
`colnames<-`(newBamAD(mydf),c('start','REF','ALT','newname.AD'));
## start REF ALT newname.AD
## 1 "chr20:5363934" "C" "T" "59,29"
## 2 "chr5:8529759" "G" "C" "28,41"
## 3 "chr14:9620689" "T" "G" "49,41"
これには、置換する列だけでなく、すべての列に名前を指定する必要があるという明らかな欠点がありますが、これをインラインで実行する場合は、それを回避する方法がわかりません。もちろん、最初に対象の列にインデックスを付けることもできますが、その後、残りの列が失われるため、機能しません。
もちろん、変数の戻り値をキャプチャし、インデックス割り当てを介して別のステートメントの列名を選択的に置き換えることを妨げるものは何もありません。これは、セミコロンを使用して同じ行で実行できます。
output <- newBamAD(mydf); colnames(output)[colnames(output)=='bam.AD'] <- 'newname.AD';
output;
## start REF ALT newname.AD
## 1 "chr20:5363934" "C" "T" "59,29"
## 2 "chr5:8529759" "G" "C" "28,41"
## 3 "chr14:9620689" "T" "G" "49,41"
または、結果を行列ではなくdata.frameとして返すか、を介してdata.frameに強制変換as.data.frame()
することもできます。その場合は、setNames()
またはを使用できますnames<-()
。これは、colnames<-()
上記のソリューションと同じ考慮事項があります。
data.frameルートを使用する場合は、別の可能性があります。これは使用することですtransform()
(またはwithin()
、しかしtransform()
、私たちの目的のためにより簡潔です)。実際、テストから、この関数をマトリックスに直接適用でき、data.frameに自動的に強制されます。これは便利です。したがって、次のようになります。
transform(newBamAD(mydf),newname.AD=bam.AD,bam.AD=NULL);
## start REF ALT newname.AD
## 1 chr20:5363934 C T 59,29
## 2 chr5:8529759 G C 28,41
## 3 chr14:9620689 T G 49,41
このアプローチの欠点は、列データをコピーする必要があるのに対し、以前のソリューションでは、名前付け属性のみに触れる必要があることです。
2ステートメントソリューションの使用をお勧めします。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加