2013-10-03 121 views
1

如果Random.length的值落入基於data.frame Data$Measure的給定區間,我想分配值(概率)。根據R中的區間分配值

樣本數據:

set.seed(123) 
Data <- data.frame(Measure=sort(rnorm(10,5,2),decreasing=FALSE), 
     Probability=sort(runif(10,0,1),decreasing=FALSE)) 
Random.length <- as.vector(sort(rnorm(5,5,2),decreasing=FALSE)) 

在這裏,我想能夠概率分配給從data.frame Data相對應的值的Measure矢量Random.length

這是我試過的。它有點作品。 (僅不如來說明我的意思....)

AssignValue <- function (x,y,z){ 
CopyNumber <- rep(0, length(x)) 
for(i in 1:length(x)){ 
    if(x[i] <= y[1]) { CopyNumber[i] <- z[1] 
} else if(x[i] > y[1] & x[i] < y[2]) { CopyNumber[i] <- z[2] 
} else if(x[i] > y[2] & x[i] < y[3]) { CopyNumber[i] <- z[3] 
} else if(x[i] > y[3] & x[i] < y[4]) { CopyNumber[i] <- z[4] 
} else if(x[i] > y[4] & x[i] < y[5]) { CopyNumber[i] <- z[5] 
} else if(x[i] > y[5] & x[i] < y[6]) { CopyNumber[i] <- z[6] 
} else if(x[i] > y[6] & x[i] < y[7]) { CopyNumber[i] <- z[7] 
} else if(x[i] > y[7] & x[i] < y[8]) { CopyNumber[i] <- z[8] 
} else if(x[i] > y[8] & x[i] < y[9]) { CopyNumber[i] <- z[9] 
} else if(x[i] > y[9]) { CopyNumber[i] <- z[10] 
} 
} 
CopyNumber 
} 


AssignValue(Random.length,Data$Measure,Data$Prob) 

現在我data.frame Data是一個長度爲51,因此實際環路我是高達... Z [51]基本掃描通過整個數據框架。我只是縮短了這個示範。所以實際的解決方案應該能夠應付可能的任意長度。

此外,解決方案應該能夠使用任意長度的矢量。

編輯:循環結束時的小錯誤,現在糾正。

+1

我認爲你正在尋找的'cut'功能。 – Justin

+1

我知道功能'切',但不認爲它在這裏適合... – Maximilian

+1

你一定要找切。 –

回答

4

這很難說肯定沒有發佈所需輸出,但這應該工作:

> Data$Prob[cut(Random.length, c(0, Data$Measure[1:9], Inf))] 

[1] 0.1471136 0.5941420 0.8895393 0.8895393 0.9942698 

以編程方式調整Data$Measure指數,你會想ind = 1:(nrow(Data)-1)。我寧願這樣做,以避免混亂,但這只是我。

從評論c(0, head(Data$Measure, -1), Inf)是一個簡單的替代

+0

好發現 - 編輯 –

+2

並使該通用w.r.t.矢量長度,只需用'head(Data $ Measure,-1)'代替'Data $ Measure [1:9]'。 –

+0

從來沒有想過使用之前,好的提示 –