0

我正在寻找拆分和重组矩阵。目的是将每一行分成两行,将某些列的数据放在第一行,将其他列的数据放在第二行。

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

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 的值。

任何帮助将不胜感激,因为我很困惑。

谢谢!

麦克风

4

3 回答 3

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

但是,第一列并未完全按照您的数据进行排序。

于 2013-10-21T10:49:01.920 回答
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
}

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

于 2013-10-21T10:40:44.430 回答
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
于 2013-10-21T11:02:44.013 回答