2016-08-04 118 views
1

使用RI有三列的矩陣中的數據,並且我想用前面兩列中的值替換前兩列中的值第三。如果第三列是'1',我想用0.5替換第一列和第二列中的值(第三列無關緊要,稍後我會放棄它),否則,我想讓它們保持原樣。R - 以一列中的值爲條件替換矩陣行中的值

> MAT 
    a b c 
t4 0 1 0 
t5 1 0 0 
t6 0 1 0 
t7 0 1 0 
t8 0 1 0 
t3 0 1 0 
t1 1 0 0 
t2 0 1 0 
t9 0 0 1 
t10 0 0 1 

我可以手動執行此操作:

> MAT["t9",1:3]=c(.5,.5,0) 
> MAT["t10",1:3]=c(.5,.5,0) 
> MAT 
    a b c 
t4 0.0 1.0 0 
t5 1.0 0.0 0 
t6 0.0 1.0 0 
t7 0.0 1.0 0 
t8 0.0 1.0 0 
t3 0.0 1.0 0 
t1 1.0 0.0 0 
t2 0.0 1.0 0 
t9 0.5 0.5 0 
t10 0.5 0.5 0 

,但我有20套左右的數據和他們中的一些,我將不得不更換大約100行。我想知道是否有代碼可以用來自動化它。我一直在試圖ifelse(),但我不明白的結果:

>ifelse(MAT[,3]==1,MAT[,1:3]==c(0.5,0.5,0),MAT[,3]==0) 
    t4 t5 t6 t7 t8 t3 t1 t2 t9 t10 
TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE 
>  ifelse(MAT[,3]==1,MAT[,1:3]==c(0.5,0.5,0),ifelse(MAT[,2]==1,MAT[,2]==1,MAT[,1]==1)) 
    t4 t5 t6 t7 t8 t3 t1 t2 t9 t10 
TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE FALSE FALSE 
> ifelse(MAT[,3]==1,c(0.5,0.5,0),MAT) 
t4 t5 t6 t7 t8 t3 t1 t2 t9 t10 
0.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.5 0.5 
> ifelse(MAT[,1:3]==c(0,0,1),MAT[,1:3]==c(0.5,0.5,0),MAT) 
     a b c 
t4 0.0 1.0 0 
t5 1.0 0.0 0 
t6 0.0 1.0 0 
t7 0.0 1.0 0 
t8 0.0 0.0 0 
t3 0.0 1.0 0 
t1 1.0 0.0 0 
t2 0.0 0.0 0 
t9 0.5 0.5 0 
t10 0.5 0.5 0 

我想第一個將將通過檢查工作是否與第3列= 1,如果是用0.5替換該行, 0.5,0.0,如果不是0,我認爲第二個是笨拙的,但可能完成同樣的事情。最後一次成功完成了更改,但也取消了我想保留的其他數據。我在這一點上猜測,ifelse不是這樣做的方式,但我不知道該怎麼做。

在此先感謝。

回答

0

你滿意以下嗎?

a<-c(0,1,0,0,0,0,1,0,0,0) 
b<-c(1,0,1,1,1,1,0,1,0,0) 
c<-c(0,0,0,0,0,0,0,0,1,1) 

MAT<-data.frame(a,b,c) 
colnames(data)<-c("a","b","c") 

MAT$a[data$c == 1] <- 0.5 
MAT$b[data$c == 1] <- 0.5 
MAT<-data[,1:2] 

或者你甚至可以這樣做:

a<-c(0,1,0,0,0,0,1,0,0,0) 
b<-c(1,0,1,1,1,1,0,1,0,0) 
c<-c(0,0,0,0,0,0,0,0,1,1) 

MAT<-cbind(a,b,c) 

for(i in 1:2){ 
MAT[,i][MAT[,3] == 1] <- 0.5 
} 
MAT<-MAT[,1:2] 

注意:3列僅用於邏輯測試,它的價值是不變的。

+0

謝謝!第二個正是我所需要的。 – Jeff

+0

你可能想投票:-),我很高興它對你有用! – Waqas

+0

我做了upvote!但是我注意到,因爲我的聲望<15,我的投票將不會公開顯示。 – Jeff

0

一個for循環可以解決這個問題。

for(i in 1:3){ 
    MAT[,1][MAT[,3] == 1] = 0.5 
    MAT[,2][MAT[,3] == 1] = 0.5 
    } 
+0

謝謝!這工作完美。 – Jeff