0

次の操作を実行するデータ フレームがあります。

1)特定の列(数値データを含む)に従ってデータフレームを再描画します。

2)データフレームに列を追加します。これにより、注文した列の順序に基づいて各行に番号が割り当てられます。

3) データ フレームを行名で並べ替えます。別の列を使用して手順 1 ~ 2 を数回適用したいので、これが必要です。前の実行の順序を実行間で保持したくないのです。

私がやりたいことをする関数を書きました:

 globalQ<-function(df,x){
 df<-df[order(df[,x]),]
 leng<-length(which(is.na(df[,x])==FALSE))
 lengu<-as.integer((leng)/6)
 qvec<-c(rep(1,lengu),rep(2,lengu),rep(3,leng-5*lengu),rep(4,lengu),rep(5,lengu),   rep(6,lengu),rep(NA, times=nrow(df)-leng))
 df$name<-qvec
 df
 }

これは、一度に 1 つの列に対してうまく機能します。たとえば、df<-globalQ(exProbes,14) のようになります。

しかし、一度に1つの列で関数を呼び出して、いくつかの異なる列を使用してこれを行いたいです。

必要なのは apply() のいくつかのバージョンだと思いますが、データフレームと単一の列の両方の関数を使用して apply() を呼び出す方法に途方に暮れています。

ところで、この関数を複数の列で呼び出すと、作成する新しい列に冗長な名前が作成されるという事実を認識しています。それは後で処理します。

前もって感謝します

4

2 に答える 2

0
## for example,1's,2's,4's column is what you need,exProbes is your matrix
indices<-c(1,2,4)
x<-globalQ(exProbes,indices[1])
if (length(indices)>1) {
    for (i in indices[-1]) {
        x<-data.frame(x,globalQ(exProbes,i)) 
    }
}
于 2013-08-29T16:52:45.927 に答える
0

関数を呼び出すたびにデータフレームをソートする必要はありません。cbind結果を元のデータフレームに戻して後で並べ替えることができるような順序で結果を返すことができます。このような:

qvec<-function(y){
 leng<-sum(!is.na(y))
 lengu<-as.integer((leng)/6)
 qvec<-c(rep(1:2,each=lengu),rep(3,leng-5*lengu),rep(4:6,each=lengu),rep(NA,length(y)-leng))
 qvec[order(order(y))]
}

with(mtcars, cbind(mtcars, name1=qvec(cyl), name2=qvec(disp))[order(cyl, disp),])

これを列インデックス ( indices) の任意のベクトルで呼び出し、後で行名で並べ替えるには、次のようなものを使用します。

result <- mtcars
for(i in indices) result <- cbind(result, qvec(mtcars[,i]))
result[order(rownames(mtcars)),]
于 2013-08-29T15:17:29.340 に答える