"收起"使用列名称作为ID将多列分为两列

时间:2015-03-30 05:15:04

标签: r dataframe

在R中,我试图将数据帧的多个列折叠为两列,第一个数据帧中的列名被复制到结果数据帧中的各自列中。例如,我有以下数据框df

A     B     C     D
1     2     3     4
5     6     7     8

我正在尝试获取此输出,这在执行ANOVA测试时很有用:

 DV     IV
 A      1
 A      5
 B      2
 B      6
 C      3
 C      7
 D      4
 D      8

我通过声明新数据框来手动完成此操作:

 df2 <- data.frame("DV" = c(rep("A", 2), rep("B", 2), rep("C", 2), rep("D", 2)),
             "IV" = c(df$A, df$B, df$C, df$D))

我怀疑aggregate()或melt()可以更有效地做到这一点,但我在语法中丢失了。提前谢谢!

3 个答案:

答案 0 :(得分:5)

您可以使用melt

中的reshape2
library(reshape2)
melt(df, variable.name = "DV", value.name = "IV")

  DV IV
1  A  1
2  A  5
3  B  2
4  B  6
5  C  3
6  C  7
7  D  4
8  D  8

答案 1 :(得分:5)

A <- c(1,5)
B <- c(2,6)
C <- c(3,7)
D <- c(4,8)
df <- data.frame(A,B,C,D)

我喜欢包gather的{​​{1}},因为代码很短

tidyr

答案 2 :(得分:4)

您可以使用stack(df)或稍微改善一下结果:

setNames(rev(stack(df)), c("DV", "IV"))
  DV IV
1  A  1
2  A  5
3  B  2
4  B  6
5  C  3
6  C  7
7  D  4
8  D  8