如何堆叠重复行内容的数据帧因子

时间:2014-03-24 02:10:44

标签: r dataframe

我用过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造成的。

1 个答案:

答案 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"