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 回答