【问题标题】:"Collapse" multiple columns into two columns using column name as ID使用列名作为 ID 将多列“折叠”成两列
【发布时间】:2015-03-30 05:15:04
【问题描述】:

在 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() 可以更有效地执行此操作,但我迷失在语法中。提前致谢!

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    您可以使用reshape2 包中的melt

    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
    

    【讨论】:

    • 谢谢,这正是我想要的!
    【解决方案2】:
    A <- c(1,5)
    B <- c(2,6)
    C <- c(3,7)
    D <- c(4,8)
    df <- data.frame(A,B,C,D)
    

    我喜欢包tidyr的gather,因为代码太短了

    library(tidyr)
    df2 <- gather(df, DV, IV)
    

    【讨论】:

      【解决方案3】:

      您可以只使用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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-03-06
        • 1970-01-01
        • 1970-01-01
        • 2021-10-22
        • 1970-01-01
        • 2018-04-21
        • 1970-01-01
        • 2017-03-23
        相关资源
        最近更新 更多