2013-10-21 130 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