【问题标题】:R - Replacing values in a matrix row conditional on the values in one of the columnsR - 根据其中一列中的值替换矩阵行中的值
【发布时间】:2016-08-04 23:49:36
【问题描述】:

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

提前致谢。

【问题讨论】:

    标签: r matrix


    【解决方案1】:

    您对以下内容满意吗?

    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 列仅用于逻辑测试,其值不变。

    【讨论】:

    • 谢谢!第二个正是我需要的。
    • 你可能想投票 :-),很高兴它对你有用!
    • 我投了赞成票!但我收到通知,因为我的声望
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2020-10-24
      • 2017-11-24
      • 2020-09-22
      • 2019-11-15
      • 1970-01-01
      • 2012-10-12
      • 1970-01-01
      • 1970-01-01
      • 2021-02-19
      相关资源
      最近更新 更多