簡體   English   中英

如何堆疊重復行內容的數據幀因子

[英]How to stack data frame factors duplicating row content

我用過cast來獲取以下數據框:

> df1 = data.frame(start=LETTERS[1:5],end=LETTERS[2:6],runif(5, 1, 8),runif(5, 1, 8),runif(5, 1, 8),runif(5, 1, 8))
> colnames(df1) <- c("start", "end", "-1","0","1","2")
> df1
  start end       -1        0        1        2
1     A   B 3.618251 7.987927 5.055789 6.751314
2     B   C 6.021783 6.726739 7.818101 6.587156
3     C   D 2.012107 6.250554 3.988633 4.626493
4     D   E 6.315417 1.358453 6.544792 5.962934
5     E   F 1.147231 5.398415 2.521553 1.087538

有了這個起點,我想得到以下內容。 在下面的數據框中,合並兩個因子列,復制行。 我希望有一個簡單的解決方案,但我不是一個能干的工作:

    loc  type       -1        0        1        2
1     A start 3.618251 7.987927 5.055789 6.751314
2     B   end 3.618251 7.987927 5.055789 6.751314
3     B start 6.021783 6.726739 7.818101 6.587156
4     C   end 6.021783 6.726739 7.818101 6.587156
5     C start 2.012107 6.250554 3.988633 4.626493
6     D   end 2.012107 6.250554 3.988633 4.626493
7     D start 6.315417 1.358453 6.544792 5.962934
8     E   end 6.315417 1.358453 6.544792 5.962934
9     E start 1.147231 5.398415 2.521553 1.087538
10    F   end 1.147231 5.398415 2.521553 1.087538

感謝任何幫助。

編輯:我打算將此標記為已回答,但是如果起始數據框是cast(...)的結果,則此方法似乎不起作用。 我將打開這個變體作為另一個問題。

編輯2:我遇到的問題是由reshape庫中的cast(...)而不是dcast(...)庫中的dcast(...) reshape2

你應該能夠使用melt

library(reshape2) # I assume you already have that loaded since you mention cast
out <- melt(df1, id.vars=3:ncol(df1))
out
#          -1        0        1        2 variable value
# 1  2.618269 2.762658 1.711484 7.960830    start     A
# 2  5.003830 5.165788 3.263027 4.510824    start     B
# 3  7.695860 3.234819 5.943346 4.259366    start     C
# 4  2.767426 6.995359 3.998726 1.254995    start     D
# 5  4.116167 7.072667 1.924826 4.212113    start     E
# 6  2.618269 2.762658 1.711484 7.960830      end     B
# 7  5.003830 5.165788 3.263027 4.510824      end     C
# 8  7.695860 3.234819 5.943346 4.259366      end     D
# 9  2.767426 6.995359 3.998726 1.254995      end     E
# 10 4.116167 7.072667 1.924826 4.212113      end     F

如果行順序很重要(我認為它必須是這樣),您可以添加如下所示的步驟:

out[order(ave(as.character(out$variable), out$variable, FUN = seq_along)), ]
#          -1        0        1        2 variable value
# 1  2.618269 2.762658 1.711484 7.960830    start     A
# 6  2.618269 2.762658 1.711484 7.960830      end     B
# 2  5.003830 5.165788 3.263027 4.510824    start     B
# 7  5.003830 5.165788 3.263027 4.510824      end     C
# 3  7.695860 3.234819 5.943346 4.259366    start     C
# 8  7.695860 3.234819 5.943346 4.259366      end     D
# 4  2.767426 6.995359 3.998726 1.254995    start     D
# 9  2.767426 6.995359 3.998726 1.254995      end     E
# 5  4.116167 7.072667 1.924826 4.212113    start     E
# 10 4.116167 7.072667 1.924826 4.212113      end     F

ave步驟創建一個按順序排列的索引。

ave(as.character(out$variable), out$variable, FUN = seq_along)
#  [1] "1" "2" "3" "4" "5" "1" "2" "3" "4" "5"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM