使用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不是解决这个问题的方法,但我不确定该怎么做。
提前致谢。
答案 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
}