[英]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.