4

我正在研究 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

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

4

3 回答 3

8

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

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    
于 2012-01-29T09:54:50.207 回答
4

基础 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 中的“表”类应该是一个列联表(就像你已经构建的那样),即一个在单元格中包含计数的列联表。在这种情况下,您可能在那里有小数值并且不会有问题,但是一些期望值是整数的方法可能会阻塞非整数值。

于 2012-01-29T13:00:28.770 回答
2

由于您的数据在矩阵中,以头发颜色作为行名,您可以先将其转换为 data.frame,然后使用melt将其转换为高格式。

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")
于 2012-01-29T09:59:08.967 回答