【发布时间】: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 不是解决此问题的方法,但我不确定该怎么做。
提前致谢。
【问题讨论】: