【问题标题】:R: How to reshape a table into vectorsR:如何将表格重塑为向量
【发布时间】:2012-02-21 13:22:52
【问题描述】:

我正在研究 Kruschke 的 Doing Bayesian Data Analysis 中的示例,需要一些帮助来了解如何将数据转换为他的代码示例所需的格式。在第 22 章中,他有一张这样的桌子

         Blue  Brown  Green Hazel
Black    20    68     5     15
Blond    94    7      16    10
Brunette 84    119    29    54
Red      17    26     14    14

我很乐意将表格输入到R,方法是将其输入电子表格并使用read.table("clipboard", header=T, sep="\t") 或像这样将其输入R

con.table2 <- matrix(c(20,68,5,15,94,7,16,10,84,119,29,54,17,26,14,14),nrow=4,byrow=TRUE)
dimnames(con.table2) <- list(c("Black","Blond","Brunette","Red"),c("Blue","Brown","Green","Hazel"))

但是在他的代码中,他这样呈现这个表格,准备分析(完整代码在这里http://www.indiana.edu/~kruschke/DoingBayesianDataAnalysis/Programs/PoissonExponentialJagsSTZ.R

Freq = c(68,119,26,7,20,84,17,94,15,54,14,10,5,29,14,16)
Eye = c("Brown","Brown","Brown","Brown","Blue","Blue","Blue","Blue","Hazel" # runs off the page of his book
Hair = c("Black","Brunette","Red","Blond","Black","Brunette","Red","Blond","Black" # runs off the page of his book

看起来表格已经转换成三个向量了。最有效的方法是什么?我想用我自己的数据替换他的数据,所以学习如何将数据转换为分析所需的格式会很棒。

【问题讨论】:

    标签: r list vector reshape


    【解决方案1】:

    为此,我会在 reshape2 包中使用 melt()

    library(reshape2)
    df <- melt(con.table2, varnames=c("Hair", "Eye"), value.name="Freq")
    
    # df is a data frame, a list from which you can easily extract the
    # component vectors "Hair", "Eye", and "Freq. 
    # Try, for example:
    str(df)
    df$Hair    
    

    【讨论】:

      【解决方案2】:

      由于你的数据是一个矩阵,以头发颜色作为行名,你可以先将其转换为data.frame,然后使用melt将其转换为tall格式。

      d <- data.frame(
        Hair = rownames(ch_22_table),
        as.data.frame( ch_22_table )
      )
      library(reshape2)
      melt(d, id.vars="Hair", variable.name="Eye", value.name="Freq")
      

      【讨论】:

      • 原来melt() 有一个矩阵方法(melt.array()),所以不需要先将矩阵转换为data.frame。不错,恩尼特?
      • @JoshO'Brien:我不知道。我的第一个动作总是对数据进行规范化(即,将其置于高格式),然后我才开始思考......
      • 显然melt() 是要走的路,我需要更熟悉它。感谢您的建议。
      【解决方案3】:

      在基础 R 中有一个方法可以将“表”类的对象转换为 data.frames。它在你的矩阵上没有成功的原因是你没有告诉 R 它是一个表格。一旦你这样做了,方法就会成功:

      class(con.table2) <- "table"
      as.data.frame(con.table2)
      #-----------------------
             Var1  Var2 Freq
      1     Black  Blue   20
      2     Blond  Blue   94
      3  Brunette  Blue   84
      4       Red  Blue   17
      5     Black Brown   68
      6     Blond Brown    7
      7  Brunette Brown  119
      8       Red Brown   26
      9     Black Green    5
      10    Blond Green   16
      11 Brunette Green   29
      12      Red Green   14
      13    Black Hazel   15
      14    Blond Hazel   10
      15 Brunette Hazel   54
      16      Red Hazel   14
      

      R 中的“表”类应该是一个列联表(就像您已经构建的那样),即一个在单元格中包含计数的列联表。在这种情况下,您可以在其中包含小数值并且不会有任何问题,但是一些期望值是整数的方法可能会在非整数值上阻塞。

      【讨论】:

      • 我正在考虑使用df &lt;- as.data.frame(as.table(con.table2)); names(df) &lt;- c("hair", "eye", "freq")
      猜你喜欢
      • 2013-07-19
      • 2015-10-04
      • 2013-02-14
      • 2016-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多