2016-08-04 6 views
1

RIには3つの列を持つ行列のデータがあり、最初の2つの列の値を三番。 3番目の列が '1'の場合は、1番目と2番目の列の値を両方とも0.5に置き換えます(3番目の列は無関係ですが、後で削除します)。そうでなければ、そのままそのまま残します。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にしない場合は、2番目は厄介だと思ったが、同じことを達成するかもしれない。最後は変更に成功しましたが、他のデータも削除しました。私はこの時点で、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

関連する問題