在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()可以更有效地做到这一点,但我在语法中丢失了。提前谢谢!
答案 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