0
df2 <- data.frame(Mean = c(.5,4,2.3,1.2,3.7,3.3,.8), Numbers = "NA")


for(i in 1:length(df2$Mean)){
        if(df2$Mean[i] <= .5) {
        df2$Number[i] = 0
        }           
        else if(df2$Mean[i] > .5 & df2$Mean[i] < 1.5){
        df2$Number[i] = 1
        }
        else if(df2$Mean[i] > 1.5 & df2$Mean[i] < 2.5){
        df2$Number[i] = 2
        }
        else if(df2$Mean[i] > 2.5 & df2$Mean[i] < 3.5){
        df2$Number[i] = 3
        }
        else {
        df2$Number[i] = 4
        }
    }

これはうまくいきます!しかし、それから関数を作成してその関数を呼び出そうとすると、機能しません。関数ファイルを「df2type.txt」として保存します。

type <- function(df2){
for(i in 1:length(df2$Mean)){
        if(df2$Mean[i] <= .5) {
        df2$Number[i] = 0
        }
        else if(df2$Mean[i] > .5 & df2$Mean[i] < 1.5){
        df2$Number[i] = 1
        }
        else if(df2$Mean[i] > 1.5 & df2$Mean[i] < 2.5){
        df2$Number[i] = 2
        }
        else if(df2$Mean[i] > 2.5 & df2$Mean[i] < 3.5){
        df2$Number[i] = 3
        }
        else {
        df2$Number[i] = 4
        }
}
}

関数を次のように呼び出します。

source("df2type.txt")
type(df2)

機能が動作しない理由を教えてください。

どうもありがとう!

4

2 に答える 2

4

genotypeAllSamples関数内に存在するそのコピーを変更します。この関数が終了すると、その内部コピーは(変更とともに)破棄されます。元のバージョン(おそらくグローバルワークスペース内)は変更されていません。関数AllSamplesを戻り値にしてから、元の関数を戻り値で上書きすると、それは機能します。

genotype <- function (AllSamples){
    for(i in 1:length(AllSamples$Mean.Regression)){
        ...
    }
    AllSamples
}

それからそれは次のように呼ばれるでしょう

AllSamples <- genotype(AllSamples)

より慣用的なアプローチは、のdata.frameを変更せずにgenotype、新しい列を(ベクトルとして)作成し、それを返し、それをの列に割り当てることですAllSamples

genotype <- function (AllSamples){
    CopyNumber <- rep(0, length(AllSamples$Mean.Regression))
    for(i in seq_along(AllSamples$Mean.Regression)){
        if(AllSamples$Mean.Regression[i] < .5) {
            CopyNumber[i] <- 0
        } else if(AllSamples$Mean.Regression[i] > .5 & AllSamples$Mean.Regression[i] < 1.5) {
            CopyNumber[i] <- 1
        } else if(AllSamples$Mean.Regression[i] > 1.5 & AllSamples$Mean.Regression[i] < 2.5) {
            CopyNumber[i] <- 2
        } else if(AllSamples$Mean.Regression[i] > 2.5 & AllSamples$Mean.Regression[i] < 3.5) {
            CopyNumber[i] <- 3
        } else {
            CopyNumber[i] <- 4
        }
    }
    CopyNumber
}   

これは次のように呼ばれます

AllSamples$CopyNumber <- genotype(AllSamples)

これを行う実際の実際の方法は、明示的なループではなく、ベクトル化された関数を使用することです。

genotype <- function(AllSamples) {
    cut(AllSamples$Mean.Regression,
        breaks = c(-Inf, 0.5, 1.5, 2.5, 3.5, Inf),
        labels = FALSE) - 1
}

あなたが呼ぶ

AllSamples$CopyNumber <- genotype(AllSamples)
于 2012-10-05T18:24:04.787 に答える
4
df$Number <- findInterval( df$Mean, c( seq(0.5, 3.5, by=1) , Inf) )

df $ Mean = 3.5の場合、定義でカバーされていないエッジケースがありました。私の方法はそれに4を与えます。

この関数は、係数ではなく数値を返すことを除けばfindInterval、実際には関数と非常によく似た処理を実行しています。cut一連の間隔を設定し、各アイテムがどの間隔に分類されるかを示します。

于 2012-10-04T22:56:31.003 に答える