R - 以其中一列中的值为条件替换矩阵行中的值

时间:2016-08-04 23:49:37

标签: r matrix

使用R我有三列矩阵中的数据,我想用第三列中的值替换前两列中的值。如果第三列是' 1',我想将第一列和第二列中的值都替换为0.5(第三列是无关紧要的,我将在稍后删除它),否则,我想要离开他们就是这样。

> 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不是解决这个问题的方法,但我不确定该怎么做。

提前致谢。

2 个答案:

答案 0 :(得分: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列仅用于逻辑测试,其值不变。

答案 1 :(得分:0)

一个for循环可以解决这个问题。

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