2013-10-21 106 views
0

我期待分裂和重新组合矩阵。目的是将每行分割成两行,将来自第一行的某些列的数据和来自其他列的数据放入第二行。R:分割和重新组合矩阵

为例:
原始矩阵如下所示:

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 

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

任何帮助将不胜感激,因为我很卡住。

谢谢!

Mike

回答

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 

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

+0

谢谢,它的工作。我并不关心数据的排序。再次感谢! – Mike

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 
} 

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

+0

你绝对不需要'assign'这个问题。 – Thomas

+0

为什么不呢?这样,如果没有在每行的变量之前创建,我可以将它们链接到数据中。或者它的工作方式就像'paste(c(row.names(my.data)[k],“1”),collapse =“”)< - my.data [[k,c(1,3)]]'太? – Llopis

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