我用过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:我遇到的问题是使用cast(...)
库中的reshape
而不是dcast(...)
库中的reshape2
造成的。
答案 0 :(得分:2)
您应该只能使用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"