2016-02-11 44 views
2

我有一個原始調查數據df,其中7個項目來自5個人。每個人的一個項目(不是相同的項目)是比較的主題。矢量vec指示物品的位置。此外,還有兩個用於比較的矩陣prob1prob2。比較的結果是,如果隨機值低於prob1中相同位置的值,則原始調查響應將替換爲9.如果隨機值介於prob1prob2之間的值之間,則原始調查響應爲用99代替。R:在多次比較後替換不同列中的元素

在下面的例子中,對於第一個應答者,項目3的響應是3,這是比較的一個主題。從prob1prob2對應的值是.103.781。因爲第一個應答者的一個隨機數,.482是在這兩個值之間,所以第一個應答者的初始數據需要用99代替。

我當然可以使用for-loop來做,但它運行的很慢。我試圖使用sapply函數,但我真的沒有得到正確的解決方案。有什麼建議麼?謝謝!

set.seed(100) 
df<-as.data.frame(matrix(sample(c(1:4),35,replace=T),nrow=5)) 
vec<-c(3,5,2,3,1) 
set.seed(1) 
prob1<-round(matrix(runif(35,0,.5), nrow=5),3) 
set.seed(2) 
prob2<-round(matrix(runif(35,.51,1), nrow=5),3) 
ran<-c(.482, .298, .115, .163, .644) 

> df 
    V1 V2 V3 V4 V5 V6 V7 
1 2 2 3 3 3 1 2 
2 2 4 4 1 3 4 4 
3 3 3 2 2 3 4 2 
4 1 3 3 2 3 3 4 
5 3 1 4 3 2 2 3 
> prob1 
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] 
[1,] 0.133 0.449 0.103 0.249 0.467 0.193 0.241 
[2,] 0.186 0.472 0.088 0.359 0.106 0.007 0.300 
[3,] 0.286 0.330 0.344 0.496 0.326 0.191 0.247 
[4,] 0.454 0.315 0.192 0.190 0.063 0.435 0.093 
[5,] 0.101 0.031 0.385 0.389 0.134 0.170 0.414 
> prob2 
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] 
[1,] 0.601 0.972 0.781 0.928 0.834 0.749 0.515 
[2,] 0.854 0.573 0.627 0.988 0.700 0.583 0.591 
[3,] 0.791 0.918 0.883 0.621 0.920 0.685 0.907 
[4,] 0.592 0.739 0.599 0.728 0.584 0.982 0.936 
[5,] 0.972 0.779 0.709 0.547 0.680 0.575 0.762 
+0

如果隨機值大於'prob1'和'prob2',那麼原始調查響應是否保持不變? – Gregor

+0

是的。如果價值大於兩者,則不需要做任何事情。 –

回答

3

如果我理解正確的話,您嘗試訪問以下指標

idx <- cbind(seq_along(vec),c(vec)) 

下,你想改變df其中

ind99 <- ran < prob2[idx] 
ind09 <- ran < prob1[idx] 

所以

df[idx[ind99,]] <- 99 
df[idx[ind09,]] <- 9 
 
    V1 V2 V3 V4 V5 V6 V7 
1 2 2 99 3 3 1 2 
2 2 4 4 1 99 4 4 
3 3 9 2 2 3 4 2 
4 1 3 9 2 3 3 4 
5 99 1 4 3 2 2 3 
+0

非常感謝!因爲我不是R的專家,所以我沒有真正知道'prob2 [idx]'返回相應的五個概率,'0.781 0.700 0.918 0.599 0.972'您能解釋一下嗎? –

+0

查看用於索引'?'的幫助文件['',開始的部分「,第三種索引形式是通過數字矩陣,每個維度都有一列。 –

+0

明白了。我希望爲你的答案投票一百萬次。非常感謝!! –