1

R ループを作成し、それをデータフレームを受け取る関数に変換しました。元のコードとデータ フレームは以下のとおりです。目標は、この関数またはループを 1000 回繰り返して、各 row.name の行合計を表す 1000 列を含むデータ フレームになることです。

MY GOALは、このようなデータフレームです

row.names   rsum_s1  rsum_s2  rsum_s3  rsum_s4.....rsum_s1000 
kc231       40       57       15       34
kc25498     34       39       567      23
kc087398    28       3747     25       1938

x は元のデータ フレームで、次のようになります。

row.names   val2        val4        val3        val4
kc231       1.62E-08    3.29E-37    1.36E-14    0.29692426
kc25498     4.93E-01    4.93E-01    4.93E-01    0.49330053
kc087398    3.50E-01    1.18E-22    1.71E-08    0.35011743

LOOP 私は最初に rsum_s をリストとして与えるための作品を書きました。

  for(k in 1:length(colnames(x))) {  
        as.numeric(x[,k])
        sample(x[,k])
        x[,k]<-rank(x[,k],ties.method="min")
        rsum_s<-rowSums(x)

LOOP の出力は、各行の各行のランク合計です。名前 ID: rsum_s

structure(c(47, 142, 82), .Names = c("kc231", "kc25498", "kc087398"))

LOOP を FUNCTION に変換

sim<-function(x) { #takes a data.frame
  for(k in 1:length(colnames(x))) {  #each column set as numeric
    as.numeric(x[,k])
    sample(x[,k])  #randomly shuffle values in each column
    x[,k]<-rank(x[,k],ties.method="min") #rank each randomly shuffled columns
    rsum_s<-rowSums(x) #take the sum of the rows
    return(rsum_s)
    }
}

関数の結果は、整数ではなく整数です。

sim(dataframe1)
kc231   kc25498 kc087398
18.24   37.47   32.350117 

ここで何が間違っているのかわかりません。ループを 1000 回実行し、ループがデータ フレームに実行されるたびにランク合計の列を追加するか、関数 sim を 1000 回複製し、すべての結果を機能するデータ フレームに変換する必要があります。誰かがこのタスクを完了するのを手伝ってくれるなら、それは素晴らしいことです

どんな助けでも大歓迎です。

4

1 に答える 1

1

これがあなたが書きたかったことだと思います:

sim <- function(x) { #takes a data.frame
  for(k in 1:ncol(x)) {  #each column set as numeric
    x[,k] <- as.numeric(x[, k])
    x[,k] <- sample(x[, k])  #randomly shuffle values in each column
    x[,k] <- rank(x[, k], ties.method = "min") #rank each randomly shuffled columns
  }
  rsum_s <- rowSums(x) #take the sum of the rows
  return(rsum_s)  
}

あなたが間違ったことのいくつか:

  1. as.numeric結果を割り当てない限り効果はありsampleませんが、最も重要なことは
  2. とをループの外側の最後に移動する必要がありましたrowSums。そうしないと、関数は最初の列を処理した後に終了します。returnfor

x上記のコードは、反復ごとに全体を複数回置換しているため、まだあまり効率的ではありません。apply関数のファミリーを見て、次のようにすることをお勧めします。

sim <- function(x) {
    fun <- function(z) rank(sample(as.numeric(z)), ties.method = "min")
    y   <- as.data.frame(lapply(x, process.one.col))
    rownames(y) <- rownames(x)
    rowSums(y)
}
于 2013-04-06T13:13:38.807 に答える