0

マトリックスを分割して再結合しようとしています。各行を 2 行に分割し、特定の列のデータを最初の行に配置し、他の列のデータを 2 行目に配置します。

例:
元のマトリックスは次のようになります。

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

いずれの場合も、各行を 2 つの行に分割しました。最初の行には Col2 の値が含まれ、2 番目の行には 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

これは @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 に答える
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 に答える