R:分裂并重组基质

时间:2013-10-21 10:01:42

标签: r split

我希望拆分并重新组合矩阵。目的是将每行分成两行,将第一行中某些列的数据和其他列中的数据放入第二行。

举个例子:
原始矩阵如下所示:

Col1 Col2 Col3 Col4    
ABL  100  200  300    
BGA  400  500  600  
APN  700  800  900

我希望新矩阵看起来像这样:

Col1 Col2 Col4  
ABL1 100  300  
ABL2 200  300  
BGA1 400  600  
BGA2 500  600  
APN1 700  900  
APN2 800  900

在每种情况下,我将每行分成两行,第一行包含Col2的值,第二行包含Col3的值,两者都包含Col4的值。

任何帮助都会非常感激,因为我很困惑。

谢谢!

麦克

3 个答案:

答案 0 :(得分:1)

这样的事情可能有所帮助:

 DF <- read.table(text = "
        Col1 Col2 Col3 Col4    
        ABL  100  200  300    
        BGA  400  500  600  
        APN  700  800  900 ", header = T)

newDF <- cbind(as.character(DF$Col1), c(DF$Col2, DF$Col3), DF$Col4)

newDF <- as.data.frame(newDF[order(newDF[,1]),])

newDF$V1 <- paste(newDF$V1, 1:2, sep = "")

> newDF
    V1  V2  V3
1 ABL1 100 300
2 ABL2 200 300
3 APN1 700 900
4 APN2 800 900
5 BGA1 400 600
6 BGA2 500 600

但是,第一列的排序与您的数据不完全相同。

答案 1 :(得分:0)

你可以做一个循环,但我相信有更好的答案。 如果你在my.data中获得了数据

  my.out.data<-data.frame()
for  (k in 1:nrow(my.data){
          assign(paste(c(row.names(my.data)[k],"1"), collapse=""),my.data[[k,c(1,3)]]) #Creates the first row of data
          assign(paste(c(row.names[k],"2"), collapse=""), my.data[[k,c(2,3)]]) #Creates the second row of data
             my.out.data<-rbind(get(paste(c(row.names[k],"1"), collapse="")),get(paste(c(row.names[k],"2"), collapse=""))) #Gets the rows inside the data
}

我没有检查它,所以它可能包含一些错误,但我希望它会有所帮助。

答案 2 :(得分:0)

这是@ alexis_laz解决方案的变体:

out <- rbind(setNames(DF[,c(1,2,4)],c('Col1','Col2','Col4')),
             setNames(DF[,c(1,3,4)],c('Col1','Col2','Col4')))
out <- out[order(out$Col1),]
out$Col1 <- paste(out$Col1,1:2,sep='')
> out
  Col1 Col2 Col4
1 ABL1  100  300
4 ABL2  200  300
3 APN1  700  900
6 APN2  800  900
2 BGA1  400  600
5 BGA2  500  600