2015-07-21 62 views
3

这里是我一起工作的代码:Cbind/Rbind随着Ifelse条件

x <- c("Yes","No","No","Yes","Maybe") 
y <- t(1:10) 
z <- t(11:20) 

rbind.data.frame(ifelse(x == "Yes",y,z)) 

这将产生

X1L X12L X13L X4L X15L 
1 1 12 13 4 15 

期望得到的结果是:

x 
1 Yes 1 2 3 4 5 6 7 8 9 10 
2 No 11 12 13 14 15 16 17 18 19 20 
3 No 11 12 13 14 15 16 17 18 19 20 
4 Yes 1 2 3 4 5 6 7 8 9 10 
5 Maybe 11 12 13 14 15 16 17 18 19 20 

我在想我可以在rbind.data.frame()或cbind.data.frame()函数中使用ifelse语句。所以如果x == "Yes"那么这将与一个向量“y”结合。如所需输出的第一行所示。相反,如果x!="Yes"那么它将与矢量“z”组合。我将如何去做这件事。我也认为可能使用which()函数索引,但我想不出如何使用它。

UPDATE另一个问题

这里是我一起工作的代码:

a <- c(1,0,1,0,0,0,0) 
    b <- 1:7 

    t(sapply(a, function(test) if(test==0) b else 0)) 

Which produces 

     [,1] [,2]  [,3] [,4]  [,5]  [,6]  [,7]  
    [1,] 0 Integer,7 0 Integer,7 Integer,7 Integer,7 Integer,7 

任何你能解释一下吗?下面的代码工作,但我想知道为什么sapply函数不起作用。另外我将如何保存下面创建的矩阵?

`row.names<-`(t(t(rbind(b,0))[,(a!='1')+1L]),x) 

回答我最近问

对于sapply功能的工作,它需要在else语句的输入是一个矢量如此,

 a <- c(1,0,1,0,0,0,0) 
     b <- 1:7 
     c <- rep(0, times = length(a)) 
     t(sapply(a, function(test) if(test==0) b else c)) 

现在,这将产生适当的输出。

回答

5

尝试

t(sapply(x, function(x) if(x=='Yes') y else z)) 

或者

`row.names<-`(t(t(rbind(y,z))[,(x!='Yes')+1L]),x) 
+1

简洁,完美的作品。谢谢你会接受当stackoverflow允许它 –